عند استخدام JDBC للاتصال بقاعدة بيانات MySQL لإدخال البيانات ، لا سيما دفعات البيانات الكبيرة بشكل مستمر (100000). كيف تحسن الكفاءة؟
هناك طريقتان للبيان في واجهة برمجة JDBC جديرة بالملاحظة بشكل خاص:
يمكن تحقيق معالجة الدُفعات للبيانات باستخدام addBatch() و executeBatch() .
ومع ذلك ، تجدر الإشارة إلى أنك تحتاج أولاً إلى إعداد الالتزام اليدوي في رابط قاعدة البيانات ، connection.setAutoCommit(false) ، ثم تنفيذ connection.commit() بعد تنفيذ البيان.
استيراد java.io.bufferedreader ؛ استيراد java.io.ioException ؛ استيراد java.sql.drivermanager ؛ استيراد java.sql.preparedstate ؛ sql = "insert في DB_Test (param1 ، param2 ، param3 ، param4 ، param5) قيم (؟ ،؟ ،؟ ،؟)" ؛ سلسلة خاصة charset = "utf-8" ؛ private string connectstr = "jdbc: mysql: // localhost: 3306/test" ؛ username الخاص سلسلة خاصة = "الجذر" ؛ Private String Password = "123456" ؛ private void dostore () يلقي classnotfoundException ، sqlexception ، ioException {class.forname ("com.mysql.jdbc.driver") ؛ ConnectStr += "؟ useerverPrepStMts = false & rewriteBatchedStatements = true" ؛ // هنا هو اختبار لإدخال الدُفعات الفعالة ، ويتم إزالة إدراج الدُفعات العادية بعد تنفيذ الاتصال conn = (connection) drivermanager.getConnection (connectstrstr ، اسم المستخدم ، كلمة المرور) ؛ conn.setautocommit (false) ؛ // تعيين اليدوي التقديم العدد int = 0 ؛ PreparedStatement PSTS = conn.preparestatement (SQL) ؛ خط السلسلة = فارغ ؛ يبدأ التاريخ = تاريخ جديد () ؛ لـ (int i = 0 ؛ i <= 100000 ؛ i ++) {psts.SetString (1 ، i+"param1") ؛ psts.setString (2 ، i+"param2") ؛ psts.setString (3 ، i+"param3") ؛ psts.setString (4 ، i+"param4") ؛ psts.setString (5 ، i+"param5") ؛ psts.addbatch () ؛ // إضافة عدد معالجة الدُفعات ++ ؛ } psts.executeBatch () ؛ // تنفيذ معالجة الدُفعات conn.Commit () ؛ // إرسال نهاية التاريخ = تاريخ جديد () ؛ System.out.println ("Quantity ="+count) ؛ System.out.println ("RunTime ="+(end.getTime ()-begin.getTime ())) ؛ conn.close () ؛ } public static void main (string [] args) {try {new mysqlbatchutil (). dostore () ؛ } catch (classNotFoundException e) {E.PrintStackTrace () ؛ } catch (sqlexception e) {E.PrintStackTrace () ؛ } catch (ioException e) {E.PrintStackTrace () ؛ }}}نتائج الاختبار:
الكمية = 100001
وقت التشغيل = 4725
ما مجموعه 10W ، ويستغرق وقت التنفيذ 47 ثانية.
هذه الكفاءة لا تزال غير مرتفعة ولا يبدو أنها تحقق التأثير المطلوب وتحتاج إلى مزيد من التحسن.
يمكن أيضًا إضافة المعلمات إلى سلسلة اتصال MySQL JDBC.
rewriteBatchedStatements = صحيح
قام MySQL بإيقاف تشغيل المعالجة الدُفعات بشكل افتراضي ، ويتم تشغيله من خلال هذه المعلمة. يمكن إعادة كتابة عبارة SQL التي تم إرسالها إلى قاعدة البيانات.
useerverprepstmts = false
إذا لم يتم تمكينه (useerverprepstmts = false) ، فاستخدم com.mysql.jdbc.prepedstatement لتجميع SQL المحلي ، وأخيراً أرسله إلى DB. هذا هو SQL النهائي الذي تم استبداله.
فيما يلي القليل من التحسن ، أضف العبارة التالية إلى سلسلة الاتصال (قم بإزالة التعليقات في مُنشئ الرمز):
connectStR += "؟ useerverPrepStMts = false & rewriteBatchedStatements = true" ؛
نتائج الاختبار كما يلي:
الكمية = 100001
وقت التشغيل = 1213
مع نفس القدر من البيانات ، استغرق الأمر هذه المرة 12 ثانية فقط للتنفيذ ، مما يدل على أن كفاءة المعالجة قد تحسنت بشكل كبير. هاها
ما سبق هو كفاءة الاختبار لاستخدام JDBC لإدراج قطع 10W من البيانات في دفعات قاعدة بيانات MySQL. آمل أن يكون ذلك مفيدًا للجميع. إذا كان لديك أي أسئلة ، فيرجى ترك رسالة لي وسوف يرد المحرر على الجميع في الوقت المناسب. شكرا جزيلا لدعمكم لموقع wulin.com!