Sybase JConnect: использование ENABLE_BULK_LOAD - PullRequest
3 голосов
/ 21 января 2010

Может ли кто-нибудь предоставить пример массовых вставок через JConnect (с ENABLE_BULK_LOAD) в Sybase ASE?

Я искал в интернете и ничего не нашел.

Ответы [ 5 ]

8 голосов
/ 26 января 2010

Я связался с одним из инженеров 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
}
2 голосов
/ 20 марта 2013

Следуя большей части вашего совета, мы не увидели никаких улучшений по сравнению с простым созданием массивной строки и передачей ее партиями ~ 100-1000 строк с окружающей транзакцией. мы обошли * Метод большой строки [5000rows в 500batch]: 1716ms = ~ 2914rows в секунду. (это дерьмо!).

Наша база данных находится на виртуальном хосте с одним процессором (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
)

с четырьмя индексами на account_transaction_id (pk), account_id, DATE, contract_id.

Просто подумал, что сначала я оставлю несколько комментариев, к которым мы подключаемся:

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

мы также попробовали синтаксис .addBatch, описанный выше, но он был немного медленнее, чем просто использование java StringBuilder для создания пакета в sql вручную, а затем просто выдавить его в одном операторе execute. Удаление имен столбцов в операторе вставки дало нам удивительно большой прирост производительности, которое, казалось, было единственным, что фактически влияло на производительность. Поскольку параметр Enable_bulk_load, похоже, не оказал на него никакого влияния, а также EnableBatchWorkaround, мы также попробовали DYNAMIC_PREPARE = ​​false, что звучало многообещающе, но, похоже, ничего не делало.

Любая помощь в налаживании этих параметров была бы великолепна! Другими словами, есть ли какие-нибудь тесты, которые мы могли бы запустить, чтобы убедиться, что они действуют? Я по-прежнему убежден, что эта производительность не близка к расширению границ sybase, так как mysql из коробки делает больше, чем 16 000 строк в секунду, используя тот же «метод больших строк» ​​с той же схемой.

Приветствие Rod

2 голосов
/ 20 октября 2011

Чтобы получить пример, предоставленный Крисом Канноном, не забудьте сначала отключить режим автоматической фиксации:

dbConn.setAutoCommit(false);

И поместите следующую строку перед dbConn.commit ():

pstmt.executeBatch();

В противном случае этот метод только замедлит вставку.

0 голосов
/ 25 января 2010

Поддержка пакетных обновлений

Пакетные обновления позволяют объекту Statement отправлять несколько команд обновления как одна единица (партия) в базовую базу данных для совместной обработки.

Примечание: Чтобы использовать пакетные обновления, необходимо обновить сценарии SQL в каталоге sp в вашем каталоге установки jConnect. Глава

См. BatchUpdates.java в примере (jConnect 4.x) и sample2 (jConnect 5.x) подкаталоги для примера использования пакетных обновлений с Statement, PreparedStatement и CallableStatement. jConnect также поддерживает динамические PreparedStatements в пакете.

Ссылка:

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

0 голосов
/ 21 января 2010

Не знаю, как это сделать в Java, но вы можете загружать текстовые файлы с помощью оператора SQL LOAD TABLE. Мы сделали это с Sybase ASA через JConnect.

...