【发布时间】:2017-08-25 22:26:02
【问题描述】:
我有一个代码,它管理ArrayList<priceItem> 并使用preparedStatement 将每个项目引导到MySQL。我不知道如何提高这段代码的速度。我尝试使用.addBatch(),但没有帮助。这是代码。
try {
connection = DriverManager.getConnection(URL, USERNAME, PASSWORD);
preparetStmt = connection.prepareStatement(INSERT_NEW);
for (int i = 0; i < priceItems.size(); i++) {
preparetStmt.setString(1, priceItems.get(i).getName());
preparetStmt.setString(2, priceItems.get(i).getQuantity());
preparetStmt.setString(3, priceItems.get(i).getCost());
preparetStmt.setString(4, priceItems.get(i).getAnnotation());
preparetStmt.addBatch();
}
preparetStmt.executeBatch();
if (!connection.isClosed()) {
System.out.print("DB is closed.");
}
} catch (SQLException e) {
e.printStackTrace();
}
帮助我找到提高加载此语句的速度的方法。对于 1500 个项目,需要 2 分钟以上。我需要发送超过 15 万件物品。
【问题讨论】:
-
您必须使用 JDBC 还是直接访问数据库服务器?如果您有像 csv 这样的文件,将批次插入数据库可能会快得多
-
检查 addBatch() 的文档。你这样做的方式看起来不对。您也可以查看网络上的批处理教程。解决这些类型的问题将需要备份并从已知的开始并工作到未知。所以很难有人来帮助你。
-
另外,您应该清楚这是一次性操作,还是典型的常规数据集移动。这会对架构、索引等产生影响。
-
现在我正在使用 JDBC 并连接到本地主机,但将来我想在站点上重新定位 db。我使用 ApachePoi 提取 excel 数据并将其转换为数组列表
-
MySQL 可以直接加载 CSV 数据。根本不需要涉及 JDBC 或 Java。你为什么要测试连接是否在不可能关闭的地方关闭,为什么要打印它不是关闭的?
标签: java mysql jdbc arraylist prepared-statement