Sybase JConnect:ENABLE_BULK_LOAD用法

那里的任何人都可以通过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 } 

为了获得Chris Kannon提供的样本,请不要忘记首先禁用自动提交模式:

 dbConn.setAutoCommit(false); 

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

 pstmt.executeBatch(); 

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

在遵循了大部分建议之后,我们没有看到任何改进,只需创建一个大型字符串并在周围的事务中以约100-1000的批量发送它。 我们得到了:*大字符串方法[5000个500块]:1716毫秒=每秒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 

我们也尝试了上面描述的.addBatch语法,但它比仅使用java StringBuilder手动在sql中构建批处理然后只需在一个执行语句中推送它一样慢。 删除insert语句中的列名称给我们带来了惊人的大性能提升,它似乎是实际影响性能的唯一因素。 由于Enable_bulk_load参数似乎根本没有影响它,也没有使用EnableBatchWorkaround,我们也尝试了DYNAMIC_PREPARE = false,这看起来很有希望,但似乎也没有做任何事情。

任何帮助这些参数实际运行都会很棒! 换句话说,我们可以运行任何测试来validation它们是否有效? 我仍然相信这种性能并不接近推动sybase的界限,因为开箱即用的mysql使用相同架构的相同“大字符串方法”更像是每秒16,000次。

干杯棒

不知道如何在Java中执行此操作,但您可以使用LOAD TABLE SQL语句批量加载文本文件。 我们使用Sybase ASA通过JConnect完成了它。

支持批量更新

批量更新允许Statement对象将多个更新命令作为一个单元(批处理)提交给底层数据库以便一起处理。

注意:要使用批量更新,必须刷新jConnect安装目录下sp目录中的SQL脚本。 章节

有关使用Statement,PreparedStatement和CallableStatement进行批量更新的示例, 请参阅示例 (jConnect 4.x)和sample2(jConnect 5.x)子目录中的BatchUpdates.java 。 jConnect还批量支持动态PreparedStatements。

参考:

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

Interesting Posts