使用 IBATIS 进行插入的最快方法

2024-01-01

我需要使用 iBatis 在单个表 (SQL Server 2005) 中插入 20,000 行。最快的方法是什么?我已经在使用批处理模式,但它没有多大帮助:

try {
  sqlMap.startTransaction();
  sqlMap.startBatch();
  // ... execute statements in between
  sqlMap.commitTransaction();
} finally {
  sqlMap.endTransaction();
}

除了其他人提到的批量加载器之外,让我们考虑如何最好地通过 SQL 来完成它。 (如果您将混合数据发送到不同的表,批量加载器将无法正常工作。)

首先,您不应该使用您正在使用的任何抽象层,在本例中是 iBatis,因为它实际上不会为您提供什么价值,但该抽象层将有一些(不一定很多,但一定)CPU 成本。您实际上应该简单地使用原始数据库连接。

接下来,您将发送一堆 INSERT 语句。问题是您是否应该在语句中使用简单的字符串(即 INSERT INTO TABLE1 VALUES('x','y', 12))与准备好的语句(INSERT INTO TABLE1 VALUES(?, ?, ?))。

这将取决于您的数据库和数据库驱动程序。

使用简单字符串的问题基本上是从内部格式(假设您正在插入 Java 数据)到字符串的转换成本。将数字或日期转换为字符串实际上是一个相当昂贵的 CPU 操作。某些数据库和驱动程序将直接使用二进制数据,而不仅仅是字符串数据。因此,在这种情况下,PreparedStatement 可能不需要转换数据,从而节省一些 CPU 资源。

缺点是这个因素会因数据库供应商而异,甚至可能因 JDBC 供应商而异。例如,Postgres(我相信)仅适用于 SQL 字符串,而不适用于二进制,因此使用PreparedStatement 比简单地自己构建字符串是一种浪费。

接下来,一旦你有了你的语句类型,你想使用addBatch http://java.sun.com/j2se/1.5.0/docs/api/java/sql/Statement.html#addBatch(java.lang.String)JDBC Statement 类的 () 方法。 addBatch 的作用是将 SQL 语句分组为一个批处理。这样做的好处是,您无需向数据库发送多个请求,而是发送单个 LARGE 请求。这减少了网络流量,并将显着提高吞吐量。

详细信息是,并非所有驱动程序/数据库都支持 addBatch(至少不是很好),而且批处理的大小也是有限的。您很可能无法对所有 20,000 行进行 addBatch 并期望它能够工作,尽管这将是最好的选择。此限制也可能因数据库而异。

对于Oracle,过去我使用的是64K的缓冲区。基本上,我编写了一个包装函数,它将采用文字 INSERT 语句,并以 64K 批次的形式累积它们。

因此,如果您想通过 JDBC 通过 SQL 批量插入数据,可以采用这些方法。最大的改进是批处理模式,Statement 与PreparedStatement 相比更能节省一些 CPU,如果您的驱动程序支持二进制协议,也许还可以节省网络流量。

测试、冲洗并重复,直到您满意为止。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 IBATIS 进行插入的最快方法 的相关文章

随机推荐