سؤال

هل يمكن لأي شخص أن يقدم مثالًا على الإدراج بالجملة عبر JConnect (مع ENABLE_BULK_LOAD) إلى Sybase ASE؟

لقد بحثت على الإنترنت ولم أجد شيئًا.

هل كانت مفيدة؟

المحلول

لقد تواصلت مع أحد المهندسين في Sybase وقدموا لي عينة رمز. لذا ، أحصل على الإجابة على سؤالي.

في الأساس ، يوجد المتهدمة ، حيث أن عينة الكود كبيرة جدًا ... وهذا يفترض الكثير من المتغيرات المهيئة قبل ، ولكنها ستكون بضع مئات من الخطوط. يجب على أي شخص مهتم الحصول على الفكرة. يمكن أن ينتج عن ذلك ما يصل إلى 22 ألف إدخال في الثانية في عالم مثالي (حسب Sybase على أي حال).

SybDriver sybDriver = (SybDriver) Class.forName("com.sybase.jdbc3.jdbc.SybDriver").newInstance();
sybDriver.setVersion(com.sybase.jdbcx.SybDriver.VERSION_6);
DriverManager.registerDriver(sybDriver);

//DBProps (after including normal login/password etc.
props.put("ENABLE_BULK_LOAD","true");

//open connection here for  sybDriver

dbConn.setAutoCommit(false);    
String SQLString = "insert into batch_inserts (row_id, colname1, colname2)\n values (?,?,?) \n";

PreparedStatement   pstmt;
try
{
   pstmt = dbConn.prepareStatement(SQLString);      
}
catch (SQLException sqle)
{
   displaySQLEx("Couldn't prepare statement",sqle);
   return;
}

for (String[] val : valuesToInsert)
{
   pstmt.setString(1, val[0]);  //row_id    varchar(30)
   pstmt.setString(2, val[1]);//logical_server varchar(30)
   pstmt.setString(3, val[2]);  //client_host varchar(30)

   try
   {
      pstmt.addBatch();
   }
   catch (SQLException sqle)
   {
      displaySQLEx("Failed to build batch",sqle);
      break;
   }
}

try {
   pstmt.executeBatch();
   dbConn.commit();
   pstmt.close();
} catch (SQLException sqle) {
   //handle
}

try {
   if (dbConn != null)
      dbConn.close();
} catch (Exception e) {
   //handle
}

نصائح أخرى

بعد اتباع معظم نصيحتك ، لم نر أي تحسن حول ببساطة إنشاء سلسلة ضخمة وإرسالها عبر دفعات من 100-1000 ~ مع معاملة محيطة. لقد تجولنا: *طريقة السلسلة الكبيرة [5000 Rows in 500batches]: 1716ms = ~ 2914Rows في الثانية. (هذا هو القرف!).

يجلس DB لدينا على مضيف افتراضي مع وحدة المعالجة المركزية واحدة (I7 أسفل) ومخطط الجدول هو:

CREATE TABLE
archive_account_transactions
(
account_transaction_id INT,
entered_by INT,
account_id INT,
transaction_type_id INT,
DATE DATETIME,
product_id INT,
amount float,
contract_id INT NULL,
note CHAR(255) NULL
)

مع أربع فهارس على حساب_transaction_id (PK) ، الحساب_د ، التاريخ ، العقد.

اعتقدت فقط أنني سأقوم بنشر بعض التعليقات أولاً التي نتواصل فيها باستخدام:

jdbc:sybase:Tds:40.1.1.2:5000/ikp?EnableBatchWorkaround=true;ENABLE_BULK_LOAD=true   

لقد جربنا أيضًا بناء جملة .addbatch الموصوف أعلاه ، لكنه كان أبطأ بشكل هامشي من مجرد استخدام Java StringBuilder لإنشاء الدفعة في SQL يدويًا ثم دفعها عبر بيان تنفيذ واحد. لقد أعطانا إزالة أسماء الأعمدة في بيان إدراج أداءً كبيرًا بشكل مدهش ، ويبدو أنه الشيء الوحيد الذي يؤثر بالفعل على الأداء. نظرًا لأن param enable_bulk_load لا يبدو أنه يؤثر على الإطلاق ، كما أنه لم يكن enablebatchworkaround ، لقد جربنا أيضًا dynamic_prepare = خطأ يبدو واعداً ولكن يبدو أنه لا يبدو أنه يفعل أي شيء.

أي مساعدة في الحصول على هذه المعلمات في الواقع سيكون رائعا! بمعنى آخر ، هل هناك أي اختبارات يمكننا تشغيلها للتحقق من أنها سارية؟ ما زلت مقتنعا بأن هذا الأداء لا يقترب من دفع حدود Sybase لأن MySQL خارج الصندوق يشبه 16000 نادي في الثانية باستخدام نفس "طريقة السلسلة الكبيرة" مع نفس المخطط.

هتاف قضيب

من أجل الحصول على العينة التي يوفرها كريس كانون ، لا تنسى تعطيل وضع الالتزام التلقائي أولاً:

dbConn.setAutoCommit(false);

ووضع السطر التالي قبل dbconn.commit ():

pstmt.executeBatch();

وإلا فإن هذه التقنية سوف تبطئ فقط الإدراج.

لا أعرف كيفية القيام بذلك في Java ، ولكن يمكنك تحميل الملفات النصية مع عبارة SQL Table. لقد فعلنا ذلك مع Sybase ASA على JConnect.

دعم تحديثات الدُفعات

تتيح تحديثات الدُفعات كائن بيان لتقديم أوامر تحديث متعددة كوحدة واحدة (دفعة) إلى قاعدة بيانات أساسية للمعالجة معًا.

ملحوظة: لاستخدام تحديثات الدُفعات ، يجب عليك تحديث البرامج النصية SQL في دليل SP ضمن دليل تثبيت JConnect الخاص بك. الفصل

انظر batchupdates.java في العينة (JConnect 4.x) و Sample2 (JConnect 5.x) ، مثال على استخدام تحديثات الدُفعات مع العبارة ، المعدة ، و CollablEstatement. JConnect يدعم أيضا ديناميكية المعدة في الدفعة.

المرجعي:

http://download.sybase.com/pdfdocs/jcg0420e/prjdbc.pdf

http://manuals.sybase.com/onlinebooks/group-jcarc/jcg0520e/prjdbc/@ebt-link؛hf=0 ؛pt=7694؟target=٪25N٪14_4440_start_restart_n٪25#x

.

موارد تحديث الدُفعات الأخرى

http://java.sun.com/j2se/1.3/docs/guide/jdbc/spec2/jdbc2.1.frame6.html

http://www.jguru.com/faq/view.jsp؟eid=5079

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top