[英]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
有您的name
和address
,现在您需要在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.