java jdbc 批量_三种JDBC批量插入编程方法的比较

方法一,使用PreparedStatement加批量的方法try {

Class.forName("com.mysql.jdbc.Driver");

conn = DriverManager.getConnection(o_url, userName, password);

conn.setAutoCommit(false);

String sql = "INSERT adlogs(ip,website,yyyymmdd,hour,object_id) VALUES(?,?,?,?,?)";

PreparedStatement prest = conn.prepareStatement(sql,ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_READ_ONLY);

for(int x = 0; x < size; x++){

prest.setString(1, "192.168.1.1");

prest.setString(2, "localhost");

prest.setString(3, "20081009");

prest.setInt(4, 8);

prest.setString(5, "11111111");

prest.addBatch();

}

prest.executeBatch();

conn.commit();

conn.close();

} catch (SQLException ex) {

Logger.getLogger(MyLogger.class.getName()).log(Level.SEVERE, null, ex);

} catch (ClassNotFoundException ex) {

Logger.getLogger(MyLogger.class.getName()).log(Level.SEVERE, null, ex);

}

说明下在建Statement的时候,后面两个参数的意义:

第一个参数指定 ResultSet 的类型。其选项有:

TYPE_FORWARD_ONLY:缺省类型。只允许向前访问一次,并且不会受到其他用户对该数据库所作更改的影响。

TYPE_SCROLL_INSENSITIVE:允许在列表中向前或向后移动,甚至可以进行特定定位,例如移至列表中的第四个记录或者从当前位置向后移动两个记录。不会受到其他用户对该数据库所作更改的影响。

TYPE_SCROLL_SENSITIVE:象 TYPE_SCROLL_INSENSITIVE 一样,允许在记录中定位。这种类型受到其他用户所作更改的影响。如果用户在执行完查询之后删除一个记录,那个记录将从 ResultSet 中消失。类似的,对数据值的更改也将反映在 ResultSet 中。

第二个参数设置 ResultSet 的并发性,该参数确定是否可以更新 ResultSet。其选项有:

CONCUR_READ_ONLY:这是缺省值,指定不可以更新

ResultSet CONCUR_UPDATABLE:指定可以更新 ResultSet

方法二 使用Statement加批量的方法

conn.setAutoCommit(false);

Statement stmt = conn.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_READ_ONLY);

for(int x = 0; x < size; x++){

stmt.addBatch("INSERT INTO adlogs(ip,website,yyyymmdd,hour,object_id) VALUES('192.168.1.3', 'localhost','20081009',8,'23123')");

}

stmt.executeBatch();

conn.commit();

方法三:直接使用Statementconn.setAutoCommit(false);

Statement stmt = conn.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,

ResultSet.CONCUR_READ_ONLY);

for(int x = 0; x < size; x++){

stmt.execute("INSERT INTO adlogs(ip,website,yyyymmdd,hour,object_id) VALUES('192.168.1.3', 'localhost','20081009',8,'23123')");

}

conn.commit();

使用上述方法分别插入10万条数据的平均测试时间为:

方法一:17.844s

方法二:18.421s

方法三:16.359s

可以看出JDBC的batch语句插入不但没有性能提升,反而比没有用batch的时候要慢,当然这可能跟JDBC具体驱动的实现方法有关。 附件中是我测试代码,可以用来在自己电脑上跑一下。

在执行批量插入的时候最主要的是将自动提交取消,这样不管是否用JDBC的batch语法应该都没有关系。

conn.setAutoCommit(false)

个人觉得第一种方法是最方便最实用的。

6

4

分享到:

18e900b8666ce6f233d25ec02f95ee59.png

72dd548719f0ace4d5f9bca64e1d7715.png

2008-10-20 16:07

浏览 59997

分类:非技术

评论

4 楼

jurs30

2013-09-03

好东西,多谢楼主分享

3 楼

hzw2312

2012-08-10

06518c3a0f730e08e7ffc573306f0ee6.gif 费解万分、我也测试了一下、用Hibernate的save方法、一条条的添加

hqlDao.save(customer);

既然比用batch快很多

conn.setAutoCommit(false); //取消自动提交

Statement stmt = conn.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_READ_ONLY);

for(int x = 0; x < map.size(); x++){

CustomerManageInfo newinfo = (CustomerManageInfo)map.get(x);

StringBuffer sqlInsert = new StringBuffer();

sqlInsert.append("INSERT INTO CUSTOMERMANAGE_BASICE_INFO ");

//此处set省略......

sqlInsert.append(") ");

stmt.addBatch(sqlInsert.toString());

stmt.executeBatch();

}

try {

conn.commit();

bool = true;

} catch (Exception e1) {

e1.printStackTrace();

conn.rollback();

bool = false;

}

Hibernate用了7秒、batch用了12秒、求解......

0956f0a970daab536ce4be0ee96b00ac.gif

2 楼

qq1002517

2012-06-11

我觉得也是。 batch不可能一点效率不提,不然人家开那方法干什么。

1 楼

xifanlou

2008-10-23

弱弱的说一句:

那个...第一个是真正的批更新

后两个只是巧妙的执行了五次假更新,而且看样子是插入的重复数据,没有考虑主键么?

另外,再补充一句:

JDBC只是API,真正的批更新是怎么实现的要看数据库厂商,很多数据库没有更改协议,当执行Batch的时候,其实后台还是走的executeUpdate,是假的

真正的批更新是很牛X的,呵呵,直接插入上万组数据,与非批更新不可同日而语

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Java SQLite3 JDBC是一种用于在Java应用程序中连接和操作SQLite3数据库的API。 SQLite是一种轻量级的嵌入式数据库引擎,适用于许多小型和中小型项目。它使用简单且易于理解的SQL语法,并将所有数据库的内容存储在单个文件中,这使得SQLite非常适合于需要在单个机器上进行本地存储和处理的应用程序。 Java提供了许多用于与各种数据库进行交互的API,其中包括SQLite3数据库。JDBCJava Database Connectivity)是Java提供的用于连接和操作各种数据库的标准API。 使用Java SQLite3 JDBC,开发人员可以轻松地在Java应用程序中实现与SQLite3数据库的连接和交互。首先,需要下载并导入SQLite JDBC驱动程序,然后在代码中使用合适的连接字符串(包括数据库文件路径)连接到SQLite3数据库。一旦连接成功,就可以执行SQL语句来执行数据库的各种操作,例如插入、查询、更新和删除数据。JDBC还提供了一些方法来处理数据库事务和处理结果集。 Java SQLite3 JDBC的优势包括:易于学习和使用,无需额外的数据库服务器,占用资源少,性能良好。它是开源和免费的,适用于各种小型和中型项目。 总之,Java SQLite3 JDBC是一个有助于在Java应用程序中连接和操作SQLite3数据库的API。它提供了简单且直观的方法来实现与SQLite3数据库的连接和交互,并且是一个流行和广泛使用的工具。 ### 回答2: Java SQLite3 JDBC 是一个用于在 Java 程序中连接和操作 SQLite3 数据库的 API。它提供了一组用于在 Java 程序中执行 SQL 查询和更新的类和接口。 Java SQLite3 JDBC 提供了一种简便的方式来连接 SQLite3 数据库。通过 JDBC 驱动程序,我们可以在 Java 程序中访问 SQLite3 数据库。我们可以执行各种 SQL 查询,如 SELECT、INSERT、UPDATE 和 DELETE,并可以获取结果集以及对数据库进行事务处理。 使用 Java SQLite3 JDBC,我们首先需要下载 SQLite3 JDBC 驱动程序,并将其添加到我们的项目中。然后,我们可以通过调用 `Class.forName("org.sqlite.JDBC")` 加载驱动程序类。接下来,我们可以使用 `DriverManager.getConnection()` 方法来连接到 SQLite3 数据库,并传递数据库的连接字符串作为数。 一旦我们成功连接到数据库,我们可以使用 `Connection` 对象创建 `Statement` 或 `PreparedStatement` 对象,并使用它们来执行 SQL 查询。通过 `executeQuery()` 方法执行 SELECT 查询,并使用 `ResultSet` 对象来处理查询结果。对于 INSERT、UPDATE 或 DELETE 操作,我们可以使用 `executeUpdate()` 方法来执行 SQL 命令,并获取受影响的行数。 在完成数据库操作后,我们应该关闭 `ResultSet`、`Statement` 和 `Connection` 对象,以释放资源并保证数据的一致性。 总而言之,Java SQLite3 JDBC 提供了一个方便的方式来连接和操作 SQLite3 数据库。它可以在 Java 程序中执行各种 SQL 查询和更新,并提供了一组类和接口来处理数据库连接和事务处理。它使得在 Java 程序中使用 SQLite3 数据库变得简单和高效。 ### 回答3: Java sqlite3 jdbc是一种用于在Java编程语言中操作SQLite数据库的API。SQLite是一种轻量级、嵌入式的关系型数据库,它在本地文件中存储数据,无需配置额外的服务器。 通过Java sqlite3 jdbc,我们可以很方便地连接SQLite数据库,并对其进行增删改查的操作。首先,我们需要通过JDBC驱动程序连接到SQLite数据库。可以通过添加相关的JAR文件或在Maven中添加依赖项来获取相应的驱动。然后,我们可以使用jdbc连接字符串指定数据库的位置和其他相关数。 一旦连接成功,我们可以使用java.sql包提供的接口和方法执行SQL语句,如创建表、插入数据、更新数据和查询数据等。我们可以使用PreparedStatement类来预编译SQL语句,提高执行效率。还可以使用ResultSet类来处理查询结果。 在使用Java sqlite3 jdbc时,我们需要注意以下几点:首先,要保证数据库文件的路径正确,并具有读写权限。其次,为了防止SQL注入攻击,我们应该使用数化查询,而不是直接拼接SQL语句。另外,为了提高性能,可以使用事务来批量执行一系列SQL语句。 总的来说,Java sqlite3 jdbc为开发人员提供了一个方便、易用的工具,使他们能够轻松地在Java程序中操作SQLite数据库。通过这个API,我们可以实现对SQLite数据库的各种操作,从而满足应用程序对数据的存储和检索需求。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值