使用临时表的java数据库连接池

azpvetkf  于 2021-07-09  发布在  Java
关注(0)|答案(1)|浏览(500)

我使用apachedbcp进行连接池,使用ibatis进行spring支持的数据库事务。我尝试锻炼的情景是:
创建basicdatasource,最大初始连接数为5
创建临时表
在临时表中写入大量记录。
将记录写入实际表中。
删除临时表
这里的问题是步骤2-5在多线程模式下运行。另外,由于我使用连接池,我无法保证sttep2,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);  
}

我正在考虑进一步改进设计,在初始化连接时只创建一次temp表,而不是删除truncate表,而是在以后创建一个temp表,在第3步和第4步仍然会有问题。使用临时表的原因是我没有直接修改实际表的权限,而是通过临时表。

6pp0gazn

6pp0gazn1#

实际上,我会在主线程中创建temp表(步骤2),然后将向temp表(步骤3和步骤4)插入记录的工作量分成块,并为每个块生成线程。
JDK7为您可能感兴趣的这一步提供了forkjoin。
一旦完成了对temp和actual表的插入,然后在主线程中再次删除temp表。
这样,您就不需要确保在任何地方都使用相同的连接。可以对同一数据库使用不同的连接对象,并并行执行步骤3和步骤4。
希望这有帮助。

相关问题