Sybase jConnect ( подключение к базе данных ):Использование ENABLE_BULK_LOAD
-
22-09-2019 - |
Вопрос
Может ли кто-нибудь там привести пример массовых вставок через 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://java.sun.com/j2se/1.3/docs/guide/jdbc/spec2/jdbc2.1.frame6.html