繁体   English   中英

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

[英]How to insert many records to MySQL faster,Java?

我正在制作一个Web服务,其中即将出现许多记录,因此必须更快地将它们插入数据库。

我使用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();
}

假设您在Employee有您的nameaddress ,现在您需要在db中插入许多 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. 

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

您可以阅读Java中的批量插入以获取更多信息

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);

我假设您要在单个表中插入一行。

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

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

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

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

2)如果目标是保持服务器响应能力,那么您可以考虑执行异步插入,基本上是为了增加Web层的响应时间而使用额外的内存。 如果使用兼容J2EE 7的应用程序服务器,那么使用Java EE并发API相对容易,否则,即使J2EE规范不鼓励使用“传统” java.util.concurrent API,也应如此。它。

了解有关JPA(Java持久性Api)和Hibernate ORM的信息。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM