有没有人能提供一个通过JConnect (使用ENABLE_BULK_LOAD)批量插入Sybase ASE的例子?
我在网上找过了,什么也没找到。
发布于 2010-01-26 05:36:31
我与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
}发布于 2013-03-20 12:42:04
在遵循了您的大多数建议之后,我们没有看到与简单地创建一个巨大的字符串并将其以大约100-1000行的批量发送给周围的事务相比有任何改进。我们得到了:*大字符串方法500批5000行: 1716ms =~2914行/秒。(这是狗屎!)。
我们的数据库位于一个虚拟主机上,其中有一个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 我们也尝试了上面描述的sql语法,但它比仅仅使用java StringBuilder在sql中手动构建批处理,然后在一条execute语句中推送它要慢一些。删除insert语句中的列名给我们带来了惊人的性能提升,这似乎是唯一真正影响性能的事情。由于Enable_bulk_load参数和EnableBatchWorkaround参数似乎都没有影响它,所以我们也尝试了DYNAMIC_PREPARE=false,它听起来很有希望,但似乎也没有什么作用。
任何帮助获得这些参数实际运行的帮助都是很棒的!换句话说,我们是否可以运行一些测试来验证它们是否有效?我仍然相信,这种性能并不接近于突破sybase的界限,因为mysql使用相同的“大字符串方法”和相同的模式,开箱即用,每秒可以处理16,000行数据。
欢呼棒
发布于 2011-10-20 22:30:46
为了让Chris Kannon提供的示例正常工作,不要忘记首先禁用自动提交模式:
dbConn.setAutoCommit(false);并将以下行放在dbConn.commit()之前:
pstmt.executeBatch();否则,这种技术只会减慢插入速度。
https://stackoverflow.com/questions/2112395
复制相似问题