我如何一起使用临时表,弹簧Jdbc和连接池?

时间:2016-04-05 17:44:39

标签: mysql spring connection-pooling spring-jdbc temp-tables

我必须使用带有spring jdbc和tomcat连接池的临时表到mysql。 我有4个声明:

  • 如果存在(可能没有必要),则删除临时表
  • 创建临时表
  • 填充临时表
  • 选择加入硬表和临时表的表格

我为每个人使用此代码:

getJdbcTemplate().execute(sql);

我遇到了问题,因为表格在第二个语句中不存在:

  

表' tmp_table'不存在

我认为问题可能是连接池,因为临时表只能由一个连接访问,并且在连接关闭时会被删除。

这是我的数据源和txManager配置:

@Configuration
@EnableTransactionManagement
public class DBConfiguration {
    @Bean(destroyMethod = "close")
    public javax.sql.DataSource dataSource() {
        ...
    }

    @Bean
    public DataSourceTransactionManager txManager()
    {
        DataSourceTransactionManager tx= new DataSourceTransactionManager(dataSource());
        return tx;
    }
}

我该如何解决这个问题?我需要创建一个新的非池连接?

1 个答案:

答案 0 :(得分:0)

我尝试的解决方案是使用 SingleConnectionDataSource。

像这样。

 SingleConnectionDataSource scds = new SingleConnectionDataSource(jdbc.getDataSource().getConnection(), true);
 JdbcTemplate scdsjdbc = new JdbcTemplate(scds);
 
 scdsjdbc.execute("EXECUTE CREATE TEMPORARY TABLE QUERY!!");

 //file import with postgresql copy command. path is temporary file path.
 CopyManager cm = new CopyManager(scdsTmp.getDataSource().getConnection().unwrap(BaseConnection.class));
 cm.copyIn("copy tmp_tenant_product from STDIN with csv", new FileReader(path.toFile()));

 //result will be filled with the temporary table records
 List<Map<String, Object>> result = scdsTmp.queryForList("SELECT * FROM tmp_tenant_product");