我使用Apache dbcp进行连接池,而ibatis则使用spring支持进行数据库事务。我想要锻炼的场景是:
创建具有最大初始连接的BasicDataSource为5
创建临时表
将记录写入实际表格。
删除临时表
这里的问题是步骤2-5在多线程模式下运行。此外,因为我使用连接池,我不能保证sttep 2,3,4,5将从池中获得相同的连接对象,因此我在步骤3/4/5中看到未找到临时表XYZ。
我如何保证我可以在4次操作中重复使用相同的连接。这是第3步和第4步的代码。我不打算使用全局临时表。
@Transactional
public final void insertInBulk(final List<Rows> rows) {
getSqlMapClientTemplate().execute(new SqlMapClientCallback<Object>() {
public Object doInSqlMapClient(
SqlMapExecutor exe) throws SQLException {
executor.startBatch();
for (Rows row : rows) {
for (Object row : row.getMultiRows()) {
exe.insert("##TEMPTABLE.insert", row);
}
}
exe.executeBatch();
return null;
}});
}
public void copyValuesToActualTable() {
final Map<String, Object> procInput = new HashMap<String, Object>();
procInputMap.put("tableName", "MYTABLE");
getSqlMapClientTemplate().queryForObject("##TEMPTABLE.NAME", procInput);
}
我正在考虑通过在初始化连接时只创建一次临时表来进一步改进设计,而不是删除截断表,但是稍后将继续使用,并且仍然会遇到步骤3和4的问题。临时表的原因是我不有权访问(权限)直接修改实际的表,但是通过临时表。
答案 0 :(得分:0)
我实际上会在主线程中创建临时表(步骤2),然后将记录插入临时表(步骤3和步骤4)的工作量分解为每个块的块和生成线程。
JDK 7为您可能感兴趣的此步骤提供ForkJoin。
完成对temp和actual表的插入后,再在主线程中删除临时表。
通过这种方式,您无需确保在任何地方都使用相同的连接。您可以将不同的连接对象用于同一个数据库,然后执行步骤3&amp; 4并行。
希望这有帮助。