如何更快地向MySQL插入许多记录,Java?

时间:2014-12-01 06:47:32

标签: java mysql database prepared-statement

我正在制作一个网络服务,其中包含许多记录,并且必须更快地将它们插入数据库。

我使用PreparedStatement。有没有办法更快地插入记录?

数据是动态传递的,因此插入的数据量无法进行硬编码。我有一个不同的类,这对于数据库查询是常见的,我通过我的'Servlet'调用它。

这是数据库查询代码:

public void insertUser_Details(String name,String address) throws Exception {
    ps=con.prepareStatement("insert into registration_table(name,address) values(?,?)");
    ps.setString(1,name);  
    ps.setString(2,address);        
    ps.executeUpdate();
}

5 个答案:

答案 0 :(得分:4)

假设您在name中拥有addressEmployee,现在您需要在数据库中插入许多 Employee条记录,可以使用JDBC批处理操作并优化性能。

  PreparedStatement ps = con.prepareStatement("INSERT INTO registration_table(name,address) VALUES (?, ?)");   

  for(Employee employee: employees){
      ps.setString(1,employee.getName());
      ps.setString(2,employee.getAddress());
      ps.addBatch();// add to batch
      ps.clearParameters();
  }

  int[] results = ps.executeBatch();// execute with batch rather than execute many SQL separately. 

如果您没有实体对象(Employee)来保存数据,您还可以使用数组或集合轻松更改代码来保存数据。

您可以阅读batch insert in java了解更多信息

答案 1 :(得分:0)

INSERT INTO `insert_table` (`datetime`, `uid`, `content`, `type`) 
VALUES ('0', 'userid_0', 'content_0', 0);
INSERT INTO `insert_table` (`datetime`, `uid`, `content`, `type`) 
VALUES ('1', 'userid_1', 'content_1', 1);

INSERT INTO `insert_table` (`datetime`, `uid`, `content`, `type`) 
VALUES ('0', 'userid_0', 'content_0', 0), ('1', 'userid_1', 'content_1', 1);

答案 2 :(得分:0)

我假设你要在一张表中插入一行。

如果您的插入不太可能失败,并且您不需要回读信息(例如,您不需要自动插入的密钥),则可以使用INSERT DELAYED来排队插入并立即返回。

然而,即使立即插入也应该非常快。您可能希望查看系统约束并确定是否需要向数据库服务器添加内存,CPU或IO容量。

答案 3 :(得分:0)

可以想到两个常见的优化,可以单独使用或一起使用:

1)如果您的目标是能够增加插入记录的吞吐量,那么您可以考虑调整MySQL数据源连接池的大小。如何完成取决于您使用的Web /应用程序服务器和连接池实现。

2)如果目标是保持服务器响应,那么您可以考虑执行异步插入,基本上交换额外的内存使用量以改善Web层的响应时间。如果您使用符合J2EE 7的应用程序服务器,那么使用Java EE concurrency API应该相对容易,否则您应该能够使用"传统的" java.util.concurrent API,即使J2EE规范不鼓励它。

答案 4 :(得分:-2)

阅读JPA(Java Persistence Api)和Hibernate ORM。