aka*_*okd 10
您应该始终对单独的线程使用单独的连接,因为驱动程序以这种方式不是线程安全的.连接池可以帮助您,因为它允许以安全的方式重用连接.
您还可以执行查询 - 调度模式 - 如果我正确理解您的问题 - 其中一个线程负责查询和启动可能更新数据库的N个线程 - 所有这些线程都有单独的连接对象.
您还可以考虑通过PreparedStatement进行批量更新,因此线程不会在行和表锁中相互偶然发生,使用以下结构:
就像一个迷你db fork-join.
编辑
有关如何使用Pstmt进行批量更新的示例:
PreparedStatement pstmt = connection.prepareStatement(
"UPDATE table SET field=? WHERE id=?");
for (int i = 0; i < 100; i++) {
pstmt.setInt(1, i * i);
pstmt.setInt(2, i);
pstmt.addBatch();
}
pstmt.executeBatch();
pstmt.close();
Run Code Online (Sandbox Code Playgroud)
或者,您可以在循环中查询更新请求从处理线程到达的队列:
class WhatToUpdate {
public int id;
public int value;
}
Queue<WhatToUpdate> queue = new LinkedBlockingQueue<WhatToUpdate>();
PreparedStatement pstmt = connection.prepareStatement(
"UPDATE table SET field=? WHERE id=?");
int poisons = THE_NUMBER_OF_PROCESSING_THREADS;
while (true) {
WhatToUpdate record == queue.take();
if (record == null) { // poison pill
if (--poisons <= 0) {
break;
}
}
pstmt.setInt(1, record.value);
pstmt.setInt(2, record.id);
pstmt.addBatch();
}
pstmt.executeBatch();
pstmt.close();
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
4202 次 |
| 最近记录: |