استخدام بيانات تحميل MySQL
في قواعد البيانات ، تتمثل الطريقة الأكثر شيوعًا لكتابة البيانات في الكتابة من خلال إدراج SQL ، وبالإضافة إلى ذلك ، لاستعادة قاعدة البيانات من خلال ملفات النسخ الاحتياطي. ملف النسخ الاحتياطي هذا عبارة عن برنامج نصي SQL في MySQL ، ولكن يتم تنفيذه فعليًا في بيانات إدراج الدُفعات.
في الممارسة العملية ، غالبًا ما يتم مواجهة نوعين من المشكلات: أحدهما هو استيراد البيانات ، مثل استيراد البيانات من مستندات Word أو Excel أو TXT (تأتي هذه البيانات عمومًا من المستندات التي أدخلها الموظفون غير التقنيين من خلال أدوات المكتب) ؛ والآخر هو تبادل البيانات ، مثل تبادل البيانات بين قواعد بيانات MySQL و Oracle و DB2.
يواجه هذا مشكلة: هناك اختلافات في قواعد البيانات SQL Scripts ، و SQL Exchange أكثر إثارة للقلق. ومع ذلك ، فإن جميع قواعد البيانات تقريبًا تدعم تصدير البيانات النصية (LOAD). باستخدام هذا ، يمكننا حل مشكلات تبادل البيانات واستيرادها المذكورة أعلاه.
يتم استخدام عبارة datainfile من MySQL لقراءة الصفوف من ملف نصي بسرعة عالية وتحميلها في جدول. يجب أن يكون اسم الملف سلسلة حرفية. فيما يلي وصف عينة لـ MySQL5 ، والذي يوضح كيفية استخدام أمر LoadData الخاص بـ MySQL لتنفيذ استيراد البيانات النصية.
ملاحظة: النص المذكور هنا هو نص بتنسيق معين ، مثل فروع النص ، يتم فصل كل سطر بنفس الرمز ، وما إلى ذلك. لذلك ، هناك العديد من الطرق للحصول على مثل هذا النص ، مثل حفظ الجداول والتفوق في نص أو ملف CSV.
في المشروع ، تتمثل البيئة المستخدمة في تحميل ملف CSV بسرعة. يستخدم النظام الأصلي قاعدة بيانات DB2 ، ثم تسمى وظيفة مماثلة لـ MySQL's LoadData sysproc.db2load. ومع ذلك ، لا يمكن استخدام LoadData في الإجراءات المخزنة MySQL. يتم استدعاء هذه الطريقة في رمز Java عند أخذ الطريقة.
مثال التنفيذ:
قم بإعداد نموذج الاختبار
SQL كما يلي:
استخدم الاختبار ؛ قم بإنشاء جدول "اختبار" (`id` int (10) غير موقّع غير الموقّع auto_increment ،` a `int (11) لا ،" B` B` Babint (20) NULL ، المفتاح الأساسي (`id`) ، المفتاح` a_b` (`a` ،` b`)) المحرك = innodb auto_increment = 1 charset = utf8
رمز Java كما يلي:
package com.sen.dbtools.dbtools ؛ import org.apache.log4j.logger ؛ استيراد org.springframework.jdbc.core.jdbctemplate ؛ import java.io java.sql.sqlexception ؛ استيراد javax.sql.datasource ؛/** * Author Seven * since 07.03.2013 */الفئة العامة bulkloaddata2mysql {private static final logger = logger.getLogger (bulkloaddata2mysql.class) ؛ الخاص jdbctemplate jdbctemplate ؛ اتصال خاص conn = null ؛ public void setDataSource (DataSource DataSource) {this.jdbctemplate = new jdbctemplate (dataSource) ؛ ) لـ (int i = 1 ؛ i <= 10 ؛ i ++) {for (int j = 0 ؛ j <= 10000 ؛ j ++) {builder.append (4) ؛ builder.append ("/t") ؛ builder.append (4 + 1) ؛ builder.append ("/t") ؛ builder.append (4 + 2) ؛ builder.append ("/t") ؛ builder.append (4 + 3) ؛ builder.append ("/t") ؛ builder.append (4 + 4) ؛ builder.append ("/t") ؛ builder.append (4 + 5) ؛ builder.append ("/n") ؛ }} byte [] bytes = builder.toString (). getBytes () ؛ inputStream هو = جديد bytearrayinputStream (بايت) ؛ العودة } / ** * * تحميل البيانات المجمعة من inputStream إلى mysql * / public int bulkloadfromonputStream (سلسلة loadDatAsql ، inputStream datastream) يلقي sqlexception {if (datastream == null) {logger.info ("inputStream null ، لا توجد بيانات مستوردة") ؛) ؛ العودة 0 ؛ } conn = jdbctemplate.getDataSource (). getConnection () ؛ بيان reparedstatement = conn.preparestatement (loadDatasql) ؛ int النتيجة = 0 ؛ if (its.iswrapperfor (com.mysql.jdbc.statement.class)) {com.mysql.jdbc.preparedstatement mysqlstatement = itture.unwrap (com.mysql.jdbc.preparedstatement.class) ؛ mysqlstatement.setlocalinfileInputStream (datastream) ؛ النتيجة = mysqlstatement.executeupdate () ؛ } نتيجة الإرجاع ؛ } public static void main (string [] args) {string testSql = "تحميل البيانات المحلية infile 'sql.csv' تجاهل في اختبار الجدول (a ، b ، c ، d ، e ، f)" ؛ datastream inputStream = getTestDatainputStream () ؛ bulkloaddata2mysql dao = new BulkloadData2MySql () ؛ حاول {long begintime = system.currentTimeMillis () ؛ int rows = dao.bulkloadfrominputStream (testSql ، datastream) ؛ endtime long = system.currentTimeMillis () ؛ logger.info ("استيراد" صفوف + "صفوف الصفوف إلى mySQL و COST" + (endtime - begintime) + "ms!") ؛ } catch (sqlexception e) {E.PrintStackTrace () ؛ } system.exit (1) ؛ }}تَلمِيح:
يستخدم الكود في المثال طريقة setLocalInfileInputStream ، والتي ستتجاهل مباشرة اسم الملف واستيراد دفق IO في قاعدة البيانات. في التنفيذ الفعلي ، يمكنك أيضًا تحميل الملف على الخادم ، ثم قراءة الملف ثم استيراد الملف. في هذا الوقت ، يجب إزالة المعلمة المحلية لبيانات التحميل ، ويجب أن يكون اسم الملف هو اسم المسار المطلق الكامل.
أخيرًا ، يتم توصيل بناء جملة Infile Data Data
تحميل البيانات [low_priority | متزامن] [محلي] infile 'file_name.txt' [استبدال | تجاهل] في الجدول tbl_name [الحقول [التي تم إنهاءها "سلسلة"] [[اختياريًا] محاطًا بـ "char"] [هرب بواسطة "char"]] [خطوط [بدء "سلسلة"] [تم إنهاء "سلسلة"]] [تجاهل خطوط الأرقام] [(col_name_or_user_var ، ...)] [تعيين col_name ، ...]]]]]]]]
لخص
LoadData هو أمر مفيد للغاية. من الأسرع استيراد البيانات من ملف من بيان إدراج. تقول وثائق MySQL إنها أسرع بنسبة 20 مرة. ومع ذلك ، هناك العديد من الخيارات للأوامر ، ولكن لا يمكن استخدام معظمها. إذا كنت بحاجة إليها حقًا ، فما عليك سوى قراءة الوثائق الرسمية عند استخدامها.