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://java.sun.com/j2se/1.3/docs/guide/jdbc/spec2/jdbc2.1.frame6.html