1. ما هو تجمع اتصال JDBC؟
في اتصالات JDBC التقليدية ، في كل مرة تحصل فيها على اتصال اتصال ، تحتاج إلى تحميل بعض التعليمات البرمجية المعقدة للحصول عليها ، مثل الرمز التالي:
الاتصال الثابت العام getConn () {connection conn = null ؛ url 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. الأكثر سائدة الآن هي تجمع اتصالات Alibaba's Druid ، ومجموعة Tomcat الخاصة بالاتصال JNDI.
2. تخصيص تجمع اتصال بسيط
تحليل تجمعات الاتصال المخصصة:
1.2. نظرًا لأنه تجمع اتصال ، نحتاج إلى تنفيذ واجهة مصدر البيانات وتنفيذ الأساليب فيه. بناءً على وضعنا ، نحن حول طريقة getConnection () ؛
2. نظرًا لأننا نريد تخزين العديد من كائنات الاتصال ، فإننا نستخدم مجموعة لتخزينها. بناءً على العمليات المتكررة لإضافة وحذف ، ثم استخدم LinkedList ؛
3. إن تدمير الاتصال ليس تدمير الاتصال ، بل لإعادة الاتصال إلى تجمع الاتصال.
الترميز:
1. إنشاء فئة myDataSource وتنفيذ واجهة مصدر البيانات
عند تحميل هذه الفئة ، يجب أن يكون لها حاوية لتخزين الاتصال ، لذلك حدد خاصية ثابتة:
القائمة الثابتة الخاصة <Connate> ConnectionList = New LinkedList <> () ؛
2. نظرًا لأننا نحتاج إلى الحصول على اتصال قاعدة البيانات ، فإننا نغلف طريقة للحصول على اتصال قاعدة البيانات.
الاتصال العام getOneConnection () {connection conn = null ؛ جرب {// يتم الحصول على البيانات التي تم الحصول عليها هنا من خلال ملف الخصائص الخارجية ، وهو أكثر مرونة. inputStream in = myDatasource.class.getClassLoader (). getResourCeasStream ("JDBC/JDBC.Properties") ؛ Properties Pro = New Properties () ؛ pro.load (in) ؛ Driver = pro.getProperty ("Driver") ؛ url = pro.getProperty ("url") ؛ اسم المستخدم = pro.getProperty ("المستخدم") ؛ كلمة المرور = pro.getProperty ("كلمة المرور") ؛ class.forname (driver) ؛ conn = drivermanager.getConnection (url ، اسم المستخدم ، كلمة المرور) ؛ } catch (استثناء e) {e.getStackTrace () ؛ } return conn ؛ }لاحظ أنه يمكن تحديد البيانات التي حصلت عليها من خلال ملف الخاصية وفقًا للوضع الفعلي.
3. تهيئة عدة اتصالات ووضعها في الحاوية. يمكن تنفيذها باستخدام كتل التعليمات البرمجية الثابتة ، ولكن إذا لم يتم استخدام مصدر البيانات هذا ، فسيؤدي ذلك إلى نفايات الموارد ، لذلك فكرت في وضع تنفيذ تهيئة العديد من الاتصالات إلى مُنشئه ، أي عندما يكون هناك حاجة إلى تجمع الاتصال هذا ، فإنه سيخلق عدة اتصالات وفقًا لذلك. على النحو التالي:
MIDATASOURCE العامة () {for (int i = 0 ؛ i <5 ؛ i ++) {connection conn = getOneConnection () ؛ // استدعاء الطريقة لإنشاء connectionList.add (conn) ؛ }}4. ابدأ الآن في الكتابة إلى الطريقة الخارجية إلى getConnection () للحصول على الاتصال من تجمع الاتصال هذا
Override Public Connection getConnection () يلقي sqlexception {connection conn = null ؛ if (connectionList == null || connectionList.size () <= 0) {connection connection = getConnection () ؛ ConnectionList.add (اتصال) ؛ } conn = connectionList.Remove (0) ؛ إرجاع كون ؛ }5. قم بإنشاء طريقة إرجاع كائن ، ضع الاتصال المستخدم في تجمع الاتصال
public void backconnection (connection conn) {connectionList.add (conn) ؛ }حسنًا ، هذا يكمل تجمع اتصال مخصص بسيط ، ورمز الاختبار كما يلي:
يبرز الفراغ الثابت العام (سلسلة [] args) sqlexception {myDataSource dataSource = new MyDataSource () ؛ connect conn = datasource.getConnection () ؛ String SQL = "SELECT * from user where u_id =؟" ؛ أعدت PS = NULL ؛ resultset 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 ("password ="+rs.getString (3)) ؛ }} catch (sqlexception e) {E.PrintStackTrace () ؛ } أخيرًا {datasource.backConnection (conn) ؛ }}لأن التجاهل ، لا يوجد كائنين آخرين في الكود الخاص بي لإغلاقه.
الآن هناك مشكلة صغيرة يتم تحقيق اتصالنا الختامي من خلال طريقة تجمع الاتصال. ومع ذلك ، إذا قام المستخدم باستدعاء الطريقة الإغلاق لكائن الاتصال ، يتم تدمير الاتصال ولم يتم إرجاعها إلى تجمع الاتصال. ثم نقوم بتحسينه حتى لا يدمر المستخدم الاتصال ، ولكن بإرجاع الاتصال.
من بينها ، هناك العديد من الحلول ، وهنا نموذج زخرفي.
تحسين:
1. قم بإنشاء فئة جديدة myConnection لتنفيذ واجهة الاتصال ، حيث تكون أنواع السمات الخاصة بها Connection Conn و liis <scension>.
اتصال خاص Conn ؛ القائمة الخاصة <Connate> تجمع ؛ myConnection العامة (اتصال conn ، قائمة <Connate> pool) {this.conn = conn ؛ this.pool = pool ؛ }2. ثم قم بتنفيذ طريقة إغلاق الواجهة
Override public void close () يلقي sqlexception {system.out.println ("connection recycle") ؛ pool.add (conn) ؛ }3. ثم تنفيذ طريقة الحصول على البيان. إذا لم يتم تنفيذه ، فسيحدث خطأ مؤشر فارغ عند الحصول على هذا البيان. أنا فقط تنفيذ طريقة الحصول على المعدة.
Override Public ReparedStatement PreparSestatement (String SQL) يلقي sqlexception {system.out.println ("get state") ؛ Return Conn.Preparestatement (SQL) ؛ }4. ثم احذف الطريقة الخلفية لفئة MyDataSource لإرجاع الاتصال ، وتعديل المُنشئ والطريقة للحصول على الاتصال على النحو التالي
myDataSource2 () {for (int i = 0 ؛ i <5 ؛ i ++) {connection conn = getOneConnection () ؛ myConnection myconn = new myConnection (conn ، connectionList) ؛ ConnectionList.add (MyConn) ؛ }} Override Public Connection getConnection () يلقي sqlexception {connection conn = null ؛ if (connectionList == null || connectionList.size () <= 0) {connection connection = getConnection () ؛ myConnection myconn = new myConnection (connection ، connectionList) ؛ ConnectionList.add (MyConn) ؛ } conn = connectionList.Remove (0) ؛ إرجاع كون ؛ }حسنًا ، حتى لا يدمر المستخدم الاتصال عن طريق استدعاء طريقة إغلاق الاتصال لدينا مباشرة ، وسيعودها إلى تجمع الاتصال بشكل صحيح. يمكنك اختباره عن طريق إجراء تعديل قليل على رمز الاختبار.
المقالة أعلاه هي المحتوى الكامل الذي شاركته معك. آمل أن يعطيك مرجعًا وآمل أن تتمكن من دعم wulin.com أكثر.