Я использовал C3P0 в моей программе, мой источник данных будет меняться в зависимости от действий пользователя. Поэтому я хочу обновить конфигурацию источника данных самостоятельно. То, как я использую, каждые 10 минут я буду создавать новый шаблон JdbcTemplate с новым источником данных C3P0 и отказываться от старого. Но я обнаружил, что со временем моя машина будет поддерживать много связей с 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;
}
Я надеюсь найти причину, по которой мое приложение создает так много соединений.
Может быть, я должен освободить простое соединение самостоятельно?