1. พูลการเชื่อมต่อ JDBC คืออะไร?
ในการเชื่อมต่อ JDBC แบบดั้งเดิมทุกครั้งที่คุณได้รับการเชื่อมต่อการเชื่อมต่อคุณต้องโหลดรหัสที่ซับซ้อนบางอย่างเพื่อให้ได้มาเช่นรหัสต่อไปนี้:
การเชื่อมต่อแบบคงที่สาธารณะ getConn () {การเชื่อมต่อ conn = null; string url = "jdbc: mysql: // localhost: 3306/test"; String user = "root"; สตริงรหัสผ่าน = "รูท"; ลอง {class.forname ("com.mysql.jdbc.driver"); conn = driverManager.getConnection (URL, ผู้ใช้, รหัสผ่าน); } catch (classnotFoundException e) {e.printStackTrace (); } catch (sqlexception e) {e.printstacktrace (); } return conn; -การดำเนินการที่ซับซ้อนดังกล่าวมีไว้สำหรับการเชื่อมต่อเท่านั้น แน่นอนเราสามารถห่อหุ้มมันลงในคลาสเครื่องมือเพื่อเข้าถึง (รูปด้านบนห่อหุ้มการเชื่อมต่อของการเชื่อมต่อ) แต่เป็นการเสียประสิทธิภาพในการโหลดการเชื่อมต่อแต่ละครั้งหรือไม่? เพื่อเพิ่มประสิทธิภาพประสิทธิภาพพูลการเชื่อมต่อจะปรากฏขึ้น
เมื่อพูลการเชื่อมต่อเริ่มต้นการเชื่อมต่อหลายครั้งจะถูกสร้างขึ้นเพื่อให้เราใช้ เมื่อเราต้องการเชื่อมต่อเราจะต้องได้รับการเชื่อมต่อที่มีอยู่จากกลุ่มการเชื่อมต่อเท่านั้น เมื่อไม่มีการเชื่อมต่อที่เริ่มต้นการเชื่อมต่อจะถูกสร้างขึ้นใหม่ หลังจากใช้การเชื่อมต่อการเชื่อมต่อจะไม่ถูกทำลาย แต่จะถูกส่งกลับไปยังกลุ่มการเชื่อมต่อเพื่อใช้ในภายหลัง (แน่นอนการรวมการเชื่อมต่อไม่ได้เป็นเพียงแค่ง่าย ๆ นี่คือการแนะนำ)
พูลการเชื่อมต่อที่ใช้กันทั่วไป ได้แก่ DBCP และ C3P0 สิ่งที่สำคัญที่สุดในขณะนี้คือพูลการเชื่อมต่อ Druid ของอาลีบาบาและพูลการเชื่อมต่อ JNDI ของ Tomcat เอง
2. ปรับแต่งพูลการเชื่อมต่ออย่างง่าย
การวิเคราะห์พูลการเชื่อมต่อที่กำหนดเอง:
1.2. เนื่องจากเป็นกลุ่มการเชื่อมต่อเราจึงต้องใช้อินเทอร์เฟซ DataSource และใช้วิธีการในนั้น จากสถานการณ์ของเราเราเกี่ยวกับวิธีการ getConnection ();
2. เนื่องจากเราต้องการจัดเก็บวัตถุการเชื่อมต่อหลายอย่างเราจึงใช้คอลเลกชันเพื่อจัดเก็บ ขึ้นอยู่กับการดำเนินการบ่อยครั้งของการเพิ่มและลบจากนั้นใช้ LinkedList;
3. การทำลายการเชื่อมต่อไม่ได้ทำลายการเชื่อมต่อ แต่เพื่อส่งคืนการเชื่อมต่อไปยังกลุ่มการเชื่อมต่อ
การเข้ารหัส:
1. สร้างคลาส MyDataSource และใช้งานอินเตอร์เฟส DataSource
เมื่อคลาสนี้ถูกโหลดมันจะต้องมีคอนเทนเนอร์เพื่อจัดเก็บการเชื่อมต่อดังนั้นกำหนดคุณสมบัติคงที่:
รายการคงที่ส่วนตัว <การเชื่อมต่อ> ConnectionList = ใหม่ LinkedList <> ();
2. เนื่องจากเราจำเป็นต้องได้รับการเชื่อมต่อฐานข้อมูลเราจึงห่อหุ้มวิธีการเพื่อรับการเชื่อมต่อฐานข้อมูล
การเชื่อมต่อสาธารณะ getOneconnection () {การเชื่อมต่อ conn = null; ลอง {// ข้อมูลที่ได้รับที่นี่ได้รับผ่านไฟล์คุณสมบัติภายนอกซึ่งมีความยืดหยุ่นมากขึ้น inputStream ใน = myDataSource.class.getClassLoader () GetResourceaseStream ("JDBC/JDBC.Properties"); คุณสมบัติ PRO = คุณสมบัติใหม่ (); pro.load (in); driver = pro.getProperty ("ไดรเวอร์"); url = pro.getProperty ("url"); ชื่อผู้ใช้ = pro.getProperty ("ผู้ใช้"); รหัสผ่าน = pro.getProperty ("รหัสผ่าน"); class.forname (ไดรเวอร์); conn = drivermanager.getConnection (URL, ชื่อผู้ใช้, รหัสผ่าน); } catch (exception e) {e.getStackTrace (); } return conn; -โปรดทราบว่าข้อมูลที่ฉันได้รับผ่านไฟล์คุณสมบัติสามารถเลือกได้ตามสถานการณ์จริง
3. เริ่มต้นการเชื่อมต่อหลายครั้งและใส่ลงในคอนเทนเนอร์ สามารถนำไปใช้งานได้โดยใช้บล็อกรหัสแบบคงที่ แต่หากไม่ได้ใช้แหล่งข้อมูลนี้มันจะทำให้ทรัพยากรเสียดังนั้นฉันจึงพิจารณาการใช้การเริ่มต้นการเชื่อมต่อหลายครั้งในตัวสร้างของเขานั่นคือเมื่อจำเป็นต้องมีการเชื่อมต่อนี้มันจะสร้างการเชื่อมต่อหลายอย่างตามลำดับ ดังนี้:
public myDataSource () {สำหรับ (int i = 0; i <5; i ++) {การเชื่อมต่อ conn = getOneconnection (); // เรียกวิธีการสร้าง connectionList.add (conn); -4. ตอนนี้เริ่มเขียนเมธอดภายนอกเพื่อ getConnection () เพื่อรับการเชื่อมต่อจากกลุ่มการเชื่อมต่อนี้
@Override การเชื่อมต่อสาธารณะ getConnection () พ่น sqlexception {การเชื่อมต่อ conn = null; if (ConnectionList == null || connectionList.size () <= 0) {การเชื่อมต่อการเชื่อมต่อ = getConnection (); ConnectionList.add (การเชื่อมต่อ); } conn = connectionList.remove (0); กลับ Conn; -5. สร้างวิธีการส่งคืนวัตถุใส่การเชื่อมต่อที่ใช้ลงในพูลการเชื่อมต่อ
โมฆะสาธารณะ backConnection (Connection Conn) {ConnectionList.add (Conn); -ตกลงนี่จะเสร็จสิ้นพูลการเชื่อมต่อแบบกำหนดเองอย่างง่ายและรหัสทดสอบมีดังนี้:
โมฆะคงที่สาธารณะหลัก (สตริง [] args) พ่น sqlexception {myDataSource dataSource = new myDataSource (); การเชื่อมต่อ conn = dataSource.getConnection (); String sql = "เลือก * จากผู้ใช้ที่ u_id =?"; PreparedStatement PS = NULL; ผลลัพธ์ RS = NULL; ลอง {ps = conn.prepareStatement (SQL); ps.setint (1, 1); rs = ps.executeQuery (); ในขณะที่ (rs.next ()) {system.out.println ("id ="+rs.getint (1)); System.out.println ("username ="+rs.getString (2)); System.out.println ("รหัสผ่าน ="+rs.getString (3)); }} catch (sqlexception e) {e.printstacktrace (); } ในที่สุด {dataSource.backConnection (Conn); -เพราะเพิกเฉยไม่มีวัตถุอีกสองวัตถุในรหัสของฉันที่จะปิด
ตอนนี้มีปัญหาเล็ก ๆ น้อย ๆ ที่การเชื่อมต่อการปิดของเราทำได้ผ่านวิธีการเชื่อมต่อพูล อย่างไรก็ตามหากผู้ใช้เรียกวิธีการปิดของวัตถุการเชื่อมต่อการเชื่อมต่อจะถูกทำลายและไม่ถูกส่งกลับไปยังพูลการเชื่อมต่อ จากนั้นเราปรับให้เหมาะสมเพื่อให้ผู้ใช้จะไม่ทำลายการเชื่อมต่อ แต่ส่งคืนการเชื่อมต่อ
ในหมู่พวกเขามีวิธีแก้ปัญหามากมายและนี่คือรูปแบบการตกแต่ง
การเพิ่มประสิทธิภาพ:
1. สร้าง MyConnection คลาสใหม่เพื่อใช้อินเตอร์เฟสการเชื่อมต่อซึ่งประเภทแอตทริบิวต์คือการเชื่อมต่อ Conn และ liis <connection>
การเชื่อมต่อส่วนตัว Conn; รายการส่วนตัว <การเชื่อมต่อ> พูล; myConnection สาธารณะ (Connection Conn, รายการ <การเชื่อมต่อ> พูล) {this.conn = conn; this.pool = pool; -2. จากนั้นใช้วิธีการปิดของอินเทอร์เฟซ
@Override โมฆะสาธารณะปิด () พ่น sqlexception {system.out.println ("การเชื่อมต่อรีไซเคิล"); pool.add (Conn); -3 จากนั้นใช้วิธีการรับคำสั่ง หากไม่ได้ใช้งานข้อผิดพลาดตัวชี้โมฆะจะเกิดขึ้นเมื่อได้รับคำสั่งนี้ ฉันใช้วิธีการที่ได้รับการเตรียมการเท่านั้น
@Override สาธารณะ PreparedStatement Preparestatement (String SQL) พ่น Sqlexception {System.out.println ("รับคำสั่ง"); return conn.prepareStatement (SQL); -4. จากนั้นลบวิธีการ backconnection ของคลาส MyDataSource เพื่อส่งคืนการเชื่อมต่อและแก้ไขตัวสร้างและวิธีการรับการเชื่อมต่อดังนี้
สาธารณะ myDataSource2 () {สำหรับ (int i = 0; i <5; i ++) {การเชื่อมต่อ conn = getOneConnection (); myConnection myConn = myConnection ใหม่ (Conn, ConnectionList); ConnectionList.add (MyConn); - @Override การเชื่อมต่อสาธารณะ getConnection () พ่น sqlexception {การเชื่อมต่อ conn = null; if (ConnectionList == null || connectionList.size () <= 0) {การเชื่อมต่อการเชื่อมต่อ = getConnection (); myConnection myConn = myConnection ใหม่ (การเชื่อมต่อ, connectionList); ConnectionList.add (MyConn); } conn = connectionList.remove (0); กลับ Conn; -ตกลงเพื่อให้ผู้ใช้จะไม่ทำลายการเชื่อมต่อโดยเรียกวิธีการเชื่อมต่อการเชื่อมต่อของเราโดยตรงและจะส่งคืนไปยังพูลการเชื่อมต่ออย่างถูกต้อง คุณสามารถทดสอบได้โดยทำการปรับเปลี่ยนรหัสทดสอบเล็กน้อย
บทความข้างต้นเป็นเนื้อหาทั้งหมดที่ฉันได้แบ่งปันกับคุณ ฉันหวังว่ามันจะให้ข้อมูลอ้างอิงและฉันหวังว่าคุณจะสนับสนุน wulin.com มากขึ้น