我正在制作一个网络服务,其中包含许多记录,并且必须更快地将它们插入数据库。
我使用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();
}
答案 0 :(得分:4)
假设您在name
中拥有address
和Employee
,现在您需要在数据库中插入许多 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。