Sybase jConnect ( подключение к базе данных ):Использование ENABLE_BULK_LOAD

StackOverflow https://stackoverflow.com/questions/2112395

Вопрос

Может ли кто-нибудь там привести пример массовых вставок через 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 строк в 500 последовательностях]:1716 мс = ~2914 строк в секунду.(это дерьмо!).

Наша база данных находится на виртуальном хосте с одним процессором (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 .Удаление имен столбцов в инструкции insert дало нам удивительно большой прирост производительности, казалось, это единственное, что действительно повлияло на производительность.Поскольку параметр Enable_bulk_load, похоже, вообще не повлиял на это, как и параметр EnableBatchWorkaround, мы также попробовали DYNAMIC_PREPARE= false, который звучал многообещающе, но также, похоже, ничего не дал.

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

Приветствия Род

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

dbConn.setAutoCommit(false);

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

pstmt.executeBatch();

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

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

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

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

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

Смотрите Пакетные обновления.java в примере (jConnect 4.x) и подкаталоги sample2 (jConnect 5.x) для примера использования пакетных обновлений с помощью Statement, PreparedStatement и CallableStatement.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