首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Sybase JConnect: ENABLE_BULK_LOAD使用率

Sybase JConnect: ENABLE_BULK_LOAD使用率
EN

Stack Overflow用户
提问于 2010-01-22 03:57:57
回答 5查看 11.3K关注 0票数 3

有没有人能提供一个通过JConnect (使用ENABLE_BULK_LOAD)批量插入Sybase ASE的例子?

我在网上找过了,什么也没找到。

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2010-01-26 05:36:31

我与Sybase的一位工程师取得了联系,他们给我提供了一个代码样本。所以,我要回答我自己的问题。

这里基本上是一个概要,因为代码样本相当大……这里假设有很多预初始化的变量,否则只有几百行。任何感兴趣的人都应该明白这一点。这在完美世界中每秒可以产生高达22K的插入(根据Sybase )。

代码语言:javascript
复制
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
}
票数 9
EN

Stack Overflow用户

发布于 2013-03-20 12:42:04

在遵循了您的大多数建议之后,我们没有看到与简单地创建一个巨大的字符串并将其以大约100-1000行的批量发送给周围的事务相比有任何改进。我们得到了:*大字符串方法500批5000行: 1716ms =~2914行/秒。(这是狗屎!)。

我们的数据库位于一个虚拟主机上,其中有一个CPU (下面是i7),表模式是:

代码语言:javascript
复制
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。

我想我应该先发表一些评论,然后我们就可以使用:

代码语言:javascript
复制
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行数据。

欢呼棒

票数 4
EN

Stack Overflow用户

发布于 2011-10-20 22:30:46

为了让Chris Kannon提供的示例正常工作,不要忘记首先禁用自动提交模式:

代码语言:javascript
复制
dbConn.setAutoCommit(false);

并将以下行放在dbConn.commit()之前:

代码语言:javascript
复制
pstmt.executeBatch();

否则,这种技术只会减慢插入速度。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2112395

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档