java - 在一个循环中批量插入到不同的表

标签 java multithreading jdbc batch-processing

我正在解析一个保留用户信息的 JSON 文件。我一一获取信息并构建了一些类,例如User、UserSettings。现在所有这些信息都应该插入到数据库中。

JSON 文件太大,可以有超过 500000 个用户。

要插入例如用户类信息,我使用以下代码:

String sql = "INSERT INTO USERS (name, city, phone) values (?,?,?)";
Connection conn = getConnection();
PreparedStatement ps = conn.prepareStatement(sql);

final int batchSize = 500;
int count = 0;

User user;
UserSettings userSettings;


for (loop JSON file here and get user info one by one) 
{
     user = parseUser();
     userSettings = parseUserSettings();
     ps.setSting(1,user.getName());
     ps.setString(2,user.getCity());
     ps.setString(3,user.getPhone());
     ps.addBatch();

     if(++count % batchSize == 0)
        ps.executeBatch();
}
ps.executeBatch();
ps.close();
conn.close();

现在在同一个循环中,我想批量插入到另一个表 UserSettings 中。因为我不想循环两次 JSON 来获取 UserSettings 信息。请提供一些解决方案!

我认为在同一循环中为每个表都有一个单独的线程。在每个线程中我都会有他的批处理。不确定这是否有效,也许还有其他解决方案。

最佳答案

您可以为 INSERT INTO USERSETTINGS 创建另一个 PreparedStatement,并在同一循环中为该语句调用 addBatch/executeBatch

如果这是离线/一次性操作,您可能有更多替代方案(特定于供应商的加载程序工具),但这取决于您的 RDBMS。

关于java - 在一个循环中批量插入到不同的表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29058324/

相关文章:

java - ComparisonChain用于多种排序方式?

java - RunOnUiThread 无法加载,需要对象引用(android)

java - 使用 JMockit 模拟被测类的私有(private)方法

python - EAFP/LBYL 的并发影响

java - 如何检查线程是否正在 hibernate ?

java - 如何在Java中停止线程

java - 有没有办法告诉 JDBC 我即将执行一个事务?

java - SQLException.getSQLState 的所有可能值是什么?

mysql - mysql中Connections_connected和线程连接的区别

java - 如何通过命令行查看java类文件的注释?