ในการพัฒนาเรามักจะใช้พูลการเชื่อมต่อฐานข้อมูลเช่นพูลการเชื่อมต่อฐานข้อมูล DBCP บทนี้จะอธิบายการใช้งานง่าย ๆ ของการเชื่อมต่อ Java DBCP DBCP Database Library Connection Pools
เครื่องมือพัฒนา Myeclipse2014
1. ก่อนสร้างโครงการเว็บ ฉันตั้งชื่อชื่อโครงการ testjdbc ฉันต้องการไฟล์กำหนดค่าด้วย web.xml เพื่อกำหนดค่า servlet หลังจากการสร้างเสร็จสมบูรณ์โครงสร้างโครงการมีดังนี้:
2. สร้างแพ็คเกจ ชื่อแพ็คเกจที่ฉันสร้างขึ้นคือ com.szkingdom.db
3. สร้างคลาสช่วยเหลือ CastUtil รหัสมีดังนี้:
แพ็คเกจ com.szkingdom.db; /*** สร้างโดย Jack เมื่อปี 2015/12/26 * คลาสการทำงานของเครื่องมือการดำเนินการคลาส*/ คลาสสาธารณะ castutil {/** แปลงเป็นประเภทสตริง**/ สตริงคงที่สาธารณะ caststring (Object obj) {return castutil.castString (obj, ""); } / * * แปลงเป็นประเภทสตริง (ให้ค่าเริ่มต้น) * * / สตริงคงที่สาธารณะ caststring (Object OBJ, String DefaultValue) {return obj! = null? string.valueof (obj): defaultValue; } / * * แปลงเป็น double type * * / public double castdouble (object obj) {return castdouble (obj, (double) 0); } / * * แปลงเป็นสองประเภท (ให้ค่าเริ่มต้น) * * / สาธารณะคงที่ castDouble (Object OBJ, Double DefaultValue) {double doubleValue = defaultValue; if (obj! = null) {string strvalue = caststring (obj); if (stringutil.isnotEmpty (strvalue)) {ลอง {doublevalue = double.parsedouble (strvalue); } catch (numberFormatexception e) {defaultValue = defaultValue; }}} ส่งคืน doublevalue; } / * * แปลงเป็นประเภทยาว * * / castlong ยาวคงที่ (Object obj) {return castlong (obj, 0); } / * * แปลงเป็นประเภทยาว (ให้ค่าเริ่มต้น) * * / castlong ยาวคงที่สาธารณะ (Object OBJ, Long DefaultValue) {Long LongValue = defaultValue; if (obj! = null) {string strvalue = caststring (obj); if (stringutil.isnotEmpty (strvalue)) {ลอง {longValue = long.parselong (strvalue); } catch (numberFormatexception e) {longValue = defaultValue; }} ส่งคืน LongValue; } / * * แปลงเป็น int type * * / public Static int castint (Object obj) {return castint (obj, 0); } / * * แปลงเป็นประเภท int (ให้ค่าเริ่มต้น) * * / public Static int castint (Object OBJ, int defaultValue) {int intvalue = defaultValue; if (obj! = null) {string strvalue = caststring (obj); if (stringUtil.isnotEmpty (strvalue)) {ลอง {intvalue = integer.parseint (strvalue); } catch (numberFormatexception e) {intValue = defaultValue; }}} ส่งคืน intvalue; } / * * แปลงเป็นประเภทบูลีน * * / บูลีนสแตติกแบบคงที่ Castboolean (Object obj) {ส่งคืน Castboolean (OBJ, FALSE); } / * * แปลงเป็นประเภทบูลีน (ให้ค่าเริ่มต้น) * * / บูลีนสแตติกแบบคงที่ castboolean (Object OBJ, Boolean DefaultValue) {บูลีนบูลีน BooleanValue = defaultValue; if (obj! = null) {booleanValue = boolean.parseboolean (caststring (obj)); } ส่งคืน booleanValue; - 4. สร้างไฟล์คุณสมบัติเพื่ออ่าน propsutil คลาสวิธีใช้รหัสมีดังนี้:
แพ็คเกจ com.szkingdom.db; นำเข้า java.io.filenotfoundException; นำเข้า java.io.ioException; นำเข้า Java.io.InputStream; นำเข้า java.util.properties; /*** สร้างโดย Jack เมื่อปี 2015/12/26 * Properties File Tool Class*/Public Class PropsUtil {// ตัวบันทึกสุดท้าย Logger สุดท้ายคงที่ = loggerFactory.getLogger (propsutil.class); / * * การโหลดไฟล์คุณสมบัติ * * */ คุณสมบัติคงที่สาธารณะ loadprops (ชื่อไฟล์สตริง) {คุณสมบัติคุณสมบัติ = null; inputStream inputStream = null; ลอง {inputStream = thread.currentThread (). getContextClassLoader (). getResourceasstream (ชื่อไฟล์); if (inputStream == null) {โยน filenotFoundException ใหม่ (ชื่อไฟล์ + "ไม่พบไฟล์!"); } คุณสมบัติ = คุณสมบัติใหม่ (); Properties.load (InputStream); } catch (ioexception e) {//logger.error("load คุณสมบัติไฟล์ล้มเหลว ", e); System.out.println ("โหลดคุณสมบัติไฟล์ล้มเหลว:"+e); } ในที่สุด {if (inputStream! = null) {ลอง {inputStream.close (); } catch (ioexception e) {//logger.error("close อินพุตสตรีมความล้มเหลว ", e); System.out.println ("ปิดการสตรีมความล้มเหลว:"+e); }} คุณสมบัติการส่งคืน; } / * * รับแอตทริบิวต์อักขระ (ค่าเริ่มต้นเป็นสตริงที่ว่างเปล่า) * * * / สตริงคงที่สาธารณะ getString (คุณสมบัติคุณสมบัติ, คีย์สตริง) {return getString (อุปกรณ์ประกอบฉาก, คีย์, ""); } / * * รับแอตทริบิวต์ประเภทอักขระ (สามารถระบุค่าเริ่มต้นได้) * * / สตริงคงที่สาธารณะ getString (อุปกรณ์ประกอบคุณสมบัติ, คีย์สตริง, สตริงเริ่มต้น Value) {ค่าสตริง = defaultValue; if (props.containskey (คีย์)) {value = props.getProperty (คีย์); } ค่าส่งคืน; } / * * รับแอตทริบิวต์ประเภทตัวเลข (ค่าเริ่มต้นคือ 0) * * / public Static int getInt (อุปกรณ์ประกอบคุณสมบัติ, คีย์สตริง) {return getInt (อุปกรณ์ประกอบฉาก, คีย์, 0); } / * * รับแอตทริบิวต์ประเภทตัวเลข (สามารถระบุค่าเริ่มต้น) * * / public Static int getint (อุปกรณ์ประกอบคุณสมบัติ, คีย์สตริง, int defaultValue) {ค่า int = defaultValue; if (props.containskey (คีย์)) {value = castutil.castint (props.getProperty (คีย์)); } ค่าส่งคืน; } / * * รับคุณสมบัติบูลีน (ค่าเริ่มต้นเป็นเท็จ) * * / บูลีนสแตติกแบบคงที่ getBoolean (อุปกรณ์ประกอบฉาก, คีย์สตริง) {ส่งคืน getBoolean (อุปกรณ์ประกอบฉาก, คีย์, เท็จ); } / * * รับคุณสมบัติบูลีน (สามารถระบุค่าเริ่มต้นได้) * * / บูลีนคงที่แบบคงที่ getBoolean (อุปกรณ์ประกอบคุณสมบัติ, คีย์สตริง, บูลีนเริ่มต้น Value) {ค่าบูลีน = defaultValue; if (props.containskey (คีย์)) {value = castutil.castboolean (props.getProperty (คีย์)); } ค่าส่งคืน; - 5. สร้างคลาส Help String StringUtil รหัสมีดังนี้:
แพ็คเกจ com.szkingdom.db; /*** สร้างโดย Jack เมื่อปี 2015/12/26 * คลาสเครื่องมือสตริง */ คลาสสาธารณะ stringUtil {/ * * กำหนดว่าสตริงว่างเปล่า * */ บูลีนคงที่สาธารณะ isempty (สตริง str) {ถ้า (str! = null) {str = str.trim (); } // return stringutils.isempty (str); กลับ "" .Equals (Str); } / * * พิจารณาว่าสตริงไม่ว่างเปล่า * * / public Static Boolean isNotEmpty (String str) {return! isempty (str); - 6. สร้างไฟล์คุณสมบัติการเชื่อมต่อฐานข้อมูล dbconfig.properties ในไดเรกทอรี src
<span style = "สี:#333333;"> jdbc.driver = com.mysql.jdbc.driver jdbc.url = jdbc: mysql: // </span> <span style = "สี:#ff6666; style = "สี:#333333;"> jdbc.username = **** jdbc.password = **** </span>
7. ใส่แพ็คเกจขวดที่จำเป็นในไดเรกทอรี LIB:
8. สร้างคลาสช่วยเหลือฐานข้อมูลโดยใช้ DBCP
แพ็คเกจ com.szkingdom.db; นำเข้า Java.io.ByTearrayInputStream; นำเข้า java.sql.connection; นำเข้า java.sql.drivermanager; นำเข้า java.sql.preparedStatement; นำเข้า java.sql.resultset; นำเข้า java.sql.sqlexception; นำเข้า java.util.properties; นำเข้า org.apache.commons.dbcp2.basicDataSource; /*** สร้างโดย Jack เมื่อปี 2015/12/26 ฐานข้อมูลการดำเนินงานผู้ช่วยคลาส*/ คลาสสาธารณะ DatabaseHelper {// ส่วนตัวคงที่ logger สุดท้าย logger = // loggerFactory.getLogger (databaseHelper.class); ไดรเวอร์สตริงสุดท้ายคงที่ส่วนตัว; URL สตริงสุดท้ายคงที่ส่วนตัว; ชื่อผู้ใช้สตริงสุดท้ายส่วนตัว รหัสผ่านสตริงสุดท้ายคงที่ส่วนตัว; // ตรวจสอบให้แน่ใจหนึ่งเธรดและการเชื่อมต่อหนึ่งการเชื่อมต่อแบบเธรดที่ปลอดภัยคงที่เธรดสุดท้ายของ ThreadLocal <การเชื่อมต่อ> Connection_holder; // เธรดพูลส่วนตัวคงที่ขั้นสุดท้ายพื้นฐาน Data_Source; คงที่ {connection_holder = new ThreadLocal <Connection> (); คุณสมบัติ conf = propsutil.loadprops ("dbconfig.properties"); driver = conf.getProperty ("jdbc.driver"); url = conf.getProperty ("jdbc.url"); ชื่อผู้ใช้ = conf.getProperty ("jdbc.username"); รหัสผ่าน = conf.getProperty ("jdbc.password"); String driver = conf.getProperty ("jdbc.driver"); string url = conf.getProperty ("jdbc.url"); String username = conf.getProperty ("jdbc.username"); String passwrod = conf.getProperty ("jdbc.password"); data_source = ใหม่ basicDataSource (); data_source.setDriverClassName (ไดรเวอร์); data_source.seturl (URL); data_source.setusername (ชื่อผู้ใช้); data_source.setpassword (passwrod); // การกำหนดค่าพารามิเตอร์การเชื่อมต่อฐานข้อมูล: http://www.cnblogs.com/xdp-gacl/p/4002804.html //http://greemranqq.iteye.com/blog/19692733 //http://blog.csdn.net/j903829182/article/details/50190337 //http://blog.csdn.net/jiutianhe/article/details/39670817 //http:blttt //http://blog.csdn.net/kerafan/article/details/50382998 //http://blog.csdn.net/a9529lty/article/details/43021801 // data_source.setmaxtotal (60); // ตั้งค่าขนาดเริ่มต้น data_source.setInitialSize (10); // การเชื่อมต่อที่ไม่ได้ใช้งานขั้นต่ำ data_source.setminidle (8); // การเชื่อมต่อที่ไม่ได้ใช้งานสูงสุด data_source.setmaxidle (16); // หมดเวลารอเวลามิลลิวินาที data_source.setmaxwaitmillis (2*10,000); // เฉพาะการเชื่อมต่อปัจจุบันไม่ถูกต้องสร้างการเชื่อมต่ออื่นสำหรับแบบสอบถามปัจจุบันเพื่อใช้ data_source.settestonborrow (จริง); // RemoveAbandOnedTimeOut: การเชื่อมต่อที่ไม่ได้ใช้ (ขาด) การเชื่อมต่อ (ค่าเริ่มต้นคือ 300 วินาทีปรับเป็น 180) data_source.setRemoveAnedTimeOut (180); // removeAbandOned: หลังจากเวลาของ removeAbandOnedTimeOut เกินเวลาของ removeAbandOnedTimeout ไม่ว่าจะรีไซเคิลการเชื่อมต่อที่ไม่ได้ใช้ (ขาด) (ค่าเริ่มต้นเป็นเท็จปรับให้เป็นจริง) //data_source.setremoveAnedonEdonMaintenance data_source.setRemoveAbandonEdonBorrow (จริง); // testharialidle data_source.settestonreturn (จริง); // testonReturn data_source.settestonreturn (จริง); // SetRemoveAbandonEdOnMaintenance data_source.setRemoveAbandonEdonMaintenance (จริง); // บันทึกบันทึก data_source.setlogabandoned (จริง); // setAddress การส่งอัตโนมัติ data_source.setdefaultautocommit (จริง); // data_source.setenableautocommitonreturn (จริง); System.out.println ("เสร็จสิ้นการตั้งค่าพารามิเตอร์ของฐานข้อมูลการเชื่อมต่อฐานข้อมูล data_source !!"); /*ลอง {class.forName (ไดรเวอร์); System.out.println ("โหลดความสำเร็จของไดรเวอร์ JDBC"); } catch (classnotFoundException e) {// logger.error ("ไม่สามารถโหลดไดรเวอร์ JDBC", e); System.out.println ("ไม่สามารถโหลดไดรเวอร์ JDBC:" + e); } ในที่สุด {}*/} // private static final threadLocal <Connection> connection_holder = new ThreadLocal <การเชื่อมต่อ> (); /*** รับการเชื่อมต่อฐานข้อมูล*/การเชื่อมต่อแบบคงที่สาธารณะ getConnection () {การเชื่อมต่อ conn = connection_holder.get (); // 1 ถ้า (conn == null) {ลอง {// conn = drivermanager.getConnection (url, ชื่อผู้ใช้, รหัสผ่าน); conn = data_source.getConnection (); System.out.println ("รับความสำเร็จในการเชื่อมต่อ"); } catch (sqlexception e) {// logger.error ("รับการเชื่อมต่อล้มเหลว", e); System.out.println ("รับการเชื่อมต่อล้มเหลว:" + e); } ในที่สุด {/*system.out.println ("การเชื่อมต่อขั้นต่ำการเชื่อมต่อขั้นต่ำ minidle ="+data_source.getMinidle ()); System.out.println ("การเชื่อมต่อ maxidle maxidle ="+data_source.getmaxidle ()); System.out.println ("จำนวนสูงสุดของการเชื่อมต่อ maxtotal ="+data_source.getmaxtotal ()); System.out.println ("ขนาดเริ่มต้นขนาดเริ่มต้น ="+data_source.getInitialSize ()); System.out.println ("เวลารอหมดเวลา maxwaitmillis ="+(data_source.getmaxwaitmillis ()/1000)); System.out.println ("รับการเชื่อมต่อที่ใช้งานได้ getNumactive () ="+data_source.getNumactive ()); System.out.println ("รับจำนวนการเชื่อมต่อ getNumidle ="+data_source.getNumidle ());*/ connection_holder.set (conn); }} return conn; }/ *** ปิดการเชื่อมต่อฐานข้อมูล*/ public static void closeconnection () {connection conn = connection_holder.get (); // 1 ถ้า (conn! = null) {ลอง {conn.close (); System.out.println ("ปิดการเชื่อมต่อความสำเร็จ"); } catch (sqlexception e) {// logger.error ("ปิดการเชื่อมต่อล้มเหลว", e); System.out.println ("ปิดการเชื่อมต่อล้มเหลว:" + e); โยน RuntimeException ใหม่ (E); } ในที่สุด {connection_holder.remove (); }}} // ดำเนินการดำเนินการฐานข้อมูลการอัปเดตโมฆะแบบซิงโครไนซ์แบบคงที่สาธารณะ (int thlsh, สตริง ltnr) {การเชื่อมต่อ conn = getConnection (); if (conn == null) {system.out.println ("การเชื่อมต่อ () ในวิธีการอัปเดตคือ null !!"); } PreparedStatement PSTMT = NULL; System.out.println ("อัปเดตเริ่มต้น!"); int ltlsh = 0; ลอง {// string sql = "อัปเดตข้อความตั้งค่าเนื้อหา =? ที่ไหน id =?"; // สตริง sql1 = "เลือก ltlsh จาก t_zxthlsk โดยที่ lsh =?"; String sql = "อัปเดต t_wx_ltnrk b ตั้งค่า b.ltnr =? โดยที่ b.lsh ="+ "(เลือก a.ltlsh จาก t_zxthlsk a โดยที่ a.lsh =?)"; System.out.println ("คำสั่ง SQL ที่อัปเดตคือ: SQL->"+SQL); pstmt = conn.prepareStatement (SQL); PSTMT.SetBlob (1, ByteArrayInputStream ใหม่ (ltnr.getBytes ())); pstmt.setint (2, thlsh); /*pstmt.setstring(1, "นี่คือการทดสอบ DBCP2 2222"); pstmt.setint (2, 6);*/if (pstmt.executeUpdate ()> 0) {//system.out.println("update ข้อมูลด้วย ID = 1 สำเร็จ! "); System.out.println ("อัปเดตข้อมูลเนื้อหาการแชทของ thlsh ="+thlsh+"สำเร็จ!/n เนื้อหาแชทคือ:"+ltnr); } //conn.commit (); /* ในขณะที่(rs1.next ()) {ltlsh = rs1.getint ("ltlsh"); System.out.println ("สอบถามหมายเลขโฟลว์แชทได้สำเร็จหมายเลขโฟลว์แชทคือ ltlsh->"+ltlsh); }*///pstmt.setstring(1, "การอัปเดตเนื้อหาที่ยอดเยี่ยม"); //pstmt.setint(2, 1); //pstmt.setBlob(1, ByteArrayInputStream ใหม่ ("12345 China" .getBytes ())); //pstmt.setint(2, 76732); /*if(pstmt.executeUpdate ()> 0) {//system.out.println("update ข้อมูลด้วย id = 1 สำเร็จ! "); System.out.println ("อัปเดตข้อมูลด้วย id = 76732 สำเร็จ!"); } conn.Commit ();*/ system.out.println ("อัปเดต t_wx_ltnrk ความสำเร็จ"); } catch (sqlexception e) {//logger.error("Query Entity List Failure ", e); System.out.println ("Update Data Exception Connection ="+Conn); System.out.println ("อัปเดต t_wx_ltnrk ความล้มเหลว:" + e); โยน RuntimeException ใหม่ (E); } ในที่สุด {// closeconnection (); // closeconnection (); if (pstmt! = null) {ลอง {pstmt.close (); } catch (sqlexception e) {// toDo บล็อก catch block ที่สร้างขึ้นอัตโนมัติ E.PrintStackTrace (); System.out.println ("PreparedStatement ล้มเหลว"); }} if (conn! = null) {ลอง {conn.close (); } catch (sqlexception e) {// toDo บล็อก catch block ที่สร้างขึ้นอัตโนมัติ E.PrintStackTrace (); }} // ลบการเชื่อมต่อในเธรด การไม่ลบมันจะทำให้การเชื่อมต่อถูกปิด หลังจากปิดการเชื่อมต่อการเชื่อมต่อที่ได้รับจะอยู่ในสถานะปิดและการดำเนินการข้อมูลไม่สามารถดำเนินการ connection_holder.remove (); // closeconnection (); } // return entityList; - 9. สร้างพูลการเชื่อมต่อฐานข้อมูลพื้นฐาน หลังจากนั้นคุณสามารถจำลองการเชื่อมต่อฐานข้อมูลผ่านวิธีการอัปเดตของ DatabaseHelper เพื่อจำลองการทำงานของการรับการเชื่อมต่อฐานข้อมูลและดำเนินการข้อมูลตามความต้องการของคุณเอง
ข้างต้นเป็นเนื้อหาทั้งหมดของบทความนี้ ฉันหวังว่ามันจะเป็นประโยชน์ต่อการเรียนรู้ของทุกคนและฉันหวังว่าทุกคนจะสนับสนุน wulin.com มากขึ้น