我在程序中使用了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;
}
我希望找到我的应用程序创建这么多连接的原因。 也许我应该自己释放空闲连接?
答案 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()));
}