Sybase JConnect:ENABLE_BULK_LOAD 用法
-
22-09-2019 - |
题
任何人都可以提供通过 JConnect 批量插入的示例(使用 ENABLE_BULK_LOAD
)到 Sybase ASE?
我在互联网上搜索过,但一无所获。
解决方案
我联系了在Sybase中工程师之一,他们提供了我的代码示例。所以,我可以回答我的问题。
基本上这里是一个破败的,因为代码示例是相当大的...这是假定了很多预初始化变量,否则这将是一个几百行。有兴趣的人应该明白我的意思。这可以产生高达22K插入在一个完美的世界的第二(按的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-1000rows的批次与周围的事务发送跨。我们传开: *大的字符串的方法[在500batches 5000rows]:1716ms =〜每秒2914rows。 (这是屎!)。
我们的分贝坐在一个虚拟主机上被一个CPU(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批处理,然后就推跨在一个执行语句慢。在INSERT语句删除列名给了我们一个令人惊讶的大的性能提升似乎是唯一的东西,实际上影响了性能。由于Enable_bulk_load PARAM似乎并没有在所有影响它也没有和EnableBatchWorkaround我们也尝试DYNAMIC_PREPARE =似乎听起来很有前途,但也是假的没有做任何事情。
任何得到这些参数的帮助实际上运作将是巨大的!换句话说在那里,我们可以运行,以验证它们实际上是任何测试?我仍然相信这表现不接近使用相同的“大串法”具有相同的架构推动SYBASE的边界作为mysql的开箱确实更像是每秒16,000rows。
干杯 杆
为了得到克里斯·观音工作提供的样品,不要忘了关闭自动第一次提交方式:
dbConn.setAutoCommit(false);
和放置dbConn.commit()之前的以下行:
pstmt.executeBatch();
否则,该技术将只减速插入。
不知道如何在Java中做到这一点,但您可以用LOAD TABLE SQL语句批量装载的文本文件。我们与Sybase ASA超过JCONNECT做到了。
支持批量更新
批处理更新允许语句对象将多个更新命令作为一个单元(批次)提交给基础数据库进行处理。
笔记: 要使用批处理更新,您必须在JCONNECT安装目录下的SP Directory中刷新SQL脚本。章节
请参阅示例中的 BatchUpdates.java (JCONNECT 4.x)和Sample2(JConnect 5.X)子目录,用于使用批处理更新与语句,准备序列和CallableStatement的示例。jConnect 还支持批量动态PreparedStatements。
参考:
http://download.sybase.com/pdfdocs/jcg0420e/prjdbc.pdf
.
其他批量更新资源
http://java.sun.com/j2se/1.3/docs/guide/jdbc/spec2/jdbc2.1.frame6.html