Как освободить простое соединение c3p0 самостоятельно? - PullRequest
0 голосов
/ 25 марта 2019

Я использовал 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;
    }

Я надеюсь найти причину, по которой мое приложение создает так много соединений. Может быть, я должен освободить простое соединение самостоятельно?

1 Ответ

1 голос
/ 04 апреля 2019

Каждый раз, когда вы заменяете пул, вы должны сначала вызвать метод 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()));
}
...