如何自行释放c3p0的空闲连接?

时间:2019-03-25 11:35:07

标签: jdbctemplate c3p0

我在程序中使用了C3P0,我的数据源将根据用户的操作而改变。所以我想自己更新数据源配置。我使用的方式是每10分钟创建一个带有新C3P0数据源的新JdbcTemplate并放弃旧的JdbcTemplate。但是我发现随着时间的流逝,我的机器将与mysql保持许多连接。

我检查了ComboPooledDataSource和JdbcTemplate类,但没有找到自行释放空闲连接的方法。 这是一个演示。

@Test
    public static void test() {

        try {
            Map<Long, JdbcTemplate> myTemplates = new HashMap<>();

            myTemplates.put(1L, new JdbcTemplate(createPool()));

            final ScheduledExecutorService scheduler = Executors.newSingleThreadScheduledExecutor();

            scheduler.scheduleAtFixedRate(() -> {
                try {
                    updatePool(myTemplates);
                } catch (Exception e){
                    // do nothing
                }
            }, 0, 1, TimeUnit.SECONDS);

        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    private static void updatePool(Map<Long, JdbcTemplate> myTemplates) throws Exception{
        myTemplates.put(1L, new JdbcTemplate(createPool()));
    }


    private static ComboPooledDataSource createPool() throws Exception {
        ComboPooledDataSource dataSource = new ComboPooledDataSource();

        dataSource.setUser("xxx");
        dataSource.setPassword("yyy");
        dataSource.setInitialPoolSize(15);
        dataSource.setMinPoolSize(10);
        dataSource.setMaxPoolSize(500);
        dataSource.setMaxIdleTime(60);
        dataSource.setAcquireIncrement(5);
        dataSource.setIdleConnectionTestPeriod(10);
        dataSource.setPreferredTestQuery("select 1");
        dataSource.setDriverClass("com.mysql.jdbc.Driver");

        return dataSource;
    }

我希望找到我的应用程序创建这么多连接的原因。 也许我应该自己释放空闲连接?

1 个答案:

答案 0 :(得分:1)

每次更换池时,都应首先在池上调用close()方法。像...

private static void updatePool(Map<Long, JdbcTemplate> myTemplates) throws Exception {
  JdbcTemplate old = myTemplates.get(1L);
  if ( old != null ) {
    ((ComboPooledDataSource) old.getDataSource()).close();
  }
  myTemplates.put(1L, new JdbcTemplate(createPool()));
}