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

Java 使用临时表的数据库连接池,java,jdbc,sybase,connection-pooling,apache-commons-dbcp,Java,Jdbc,Sybase,Connection Pooling,Apache Commons Dbcp,我使用apachedbcp进行连接池,使用ibatis进行spring支持的数据库事务。我尝试训练的场景是: 创建BasicDataSource,最大初始连接数为5 创建临时表 在临时表中写入大量记录。 将记录写入实际表中 删除临时表 这里的问题是在多线程模式下运行步骤2-5。另外,由于我使用连接池,我无法保证sttep2,3,4,5将从池中获得相同的连接对象,因此我在步骤3/4/5中看到找不到临时表XYZ 如何保证在4个操作中重复使用相同的连接帐户。下面是步骤3和步骤4的代码。我不想使用全局临

我使用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;  
     }});  
}


我正在考虑进一步改进设计,在初始化连接时只创建一次临时表,而不是删除截断表,但稍后会删除一个,并且在第3步和第4步中仍然会有问题。之所以使用临时表,是因为我没有直接修改实际表的访问权限,而是通过临时表进行修改。

我实际上会在主线程中创建临时表步骤2,然后将临时表步骤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;  
     }});  
JDK 7为您可能感兴趣的这一步提供了支持

一旦插入到临时表和实际表中,然后在主线程中再次删除临时表

这样,您就不需要确保在任何地方都使用相同的连接。您可以对同一数据库使用不同的连接对象,并并行执行步骤3和步骤4


希望这有帮助。

修复源代码中的错误