Как установить свойства подключения драйвера с помощью библиотек c3p0? - PullRequest
0 голосов
/ 12 апреля 2019

Я мигрирую с dbcp2 на c3p0,

Мы создаем источник данных, расширяя BasicDataSource из dbcp2 и устанавливая свойства.Некоторые свойства устанавливаются на уровне драйвера с помощью метода setConnectionProperties.

Я не вижу такого положения в c3p0 при расширении AbstractComboPooledDataSource.Есть ли другой способ установить то же самое?

Копаясь в документах, я обнаружил нечто, называемое connectionCustomizer, но не уверен, что он делает то же самое

Вот как я сейчас устанавливаю свойства с помощью dbcp2:

this.setConnectionProperties("driver:oracle.jdbc.ReadTimeout=180000");
this.setConnectionProperties("driver:oracle.net.CONNECT_TIMEOUT=180000");

где "this" - это класс, который расширяет BasicDataSource

Есть ли в c3p0 какой-либо результат для получения того же результата?

EDIT:

Просто чтобы быть ясно, яв состоянии установить свойства, предоставляемые библиотекой c3p0, то, что я ищу, это установить свойства на уровне драйвера, что dbcp2 позволяет делать с помощью метода SetConnectionProperties (). THanks

Ответы [ 2 ]

0 голосов
/ 12 апреля 2019

Я нашел ответ в этом ответе: c3p0 зависает на getConnection при сбое сети .

cpds = new ComboPooledDataSource();
...

//--------------------------------------------------------------------------------------
// NOTE: Once you decide to use cpds.setProperties() to set some connection properties,
//       all properties must be set, including user/password, otherwise an exception
//       will be thrown
Properties prop = new Properties();
prop.setProperty("oracle.net.CONNECT_TIMEOUT",
    Integer.toString(JDBC_CONNECTION_TIMEOUT_IN_MILLISECONDS));
prop.setProperty("oracle.jdbc.ReadTimeout",
    Integer.toString(JDBC_SOCKET_TIMEOUT_IN_MILLISECONDS));
prop.setProperty("user", username);
prop.setProperty("password", password);
cpds.setProperties(prop);
0 голосов
/ 12 апреля 2019

Подробности вы можете получить из приведенного ниже ответа,

https://stackoverflow.com/a/51838455/1529092

Так что в основном вы должны сделать что-то вроде этого,

@Bean
public ComboPooledDataSource dataSource(){
    ComboPooledDataSource dataSource = new ComboPooledDataSource();

    try {
        dataSource.setDriverClass(env.getProperty("db.driver"));
        dataSource.setJdbcUrl(env.getProperty("db.url"));
        dataSource.setUser(env.getProperty("db.username"));
        dataSource.setPassword(env.getProperty("db.password"));
        dataSource.setMinPoolSize(Integer.parseInt(env.getProperty("minPoolSize")));
        dataSource.setMaxPoolSize(Integer.parseInt(env.getProperty("maxPoolSize")));
        dataSource.setMaxIdleTime(Integer.parseInt(env.getProperty("maxIdleTime")));
        dataSource.setMaxStatements(Integer.parseInt(env.getProperty("maxStatements")));
        dataSource.setMaxStatementsPerConnection(Integer.parseInt(env.getProperty("maxStatementsPerConnection")));
        dataSource.setMaxIdleTimeExcessConnections(10000);

    } catch (PropertyVetoException e) {
        e.printStackTrace();
    }
    return dataSource;
}

Edit:

В соответствии с документацией свойства тайм-аута различны в каждой среде, поэтому в этом случае время ожидания обрабатывается,

  • maxConnectionAge
  • maxIdleTime
  • maxIdleTimeExcessConnections

Управление размером пула и возрастом подключения Перейти к началу

Различные приложения имеют разные потребности в отношении компромиссов между производительностью, площадью и надежностью. C3P0 предлагает широкий Разнообразие вариантов для контроля, насколько быстро выросли пулы большой под нагрузкой вернуться к minPoolSize, и "старые" ли соединения в бассейне должны быть предварительно заменены, чтобы сохранить их Reliablity.

  • maxConnectionAge
  • maxIdleTime
  • maxIdleTimeExcessConnections

По умолчанию у пулов никогда не истекает Соединения. Если вы хотите, чтобы срок действия Соединений истек со временем, чтобы сохранить «свежесть», установите maxIdleTime и / или maxConnectionAge. maxIdleTime определяет, сколько секунд должно быть разрешено Соединение чтобы остаться неиспользованным, прежде чем быть отбракованным из бассейна. maxConnectionAge вынуждает пул отбирать любые соединения, которые были получены от база данных превышает заданное количество секунд в прошлом.

maxIdleTimeExcessConnections о минимизации количества Соединения, удерживаемые пулами c3p0, когда пул не загружен. От по умолчанию пулы c3p0 растут под нагрузкой, но сокращаются только при подключении не пройден тест соединения или истек срок действия через параметры описано выше. Некоторые пользователи хотят, чтобы их пулы быстро высвобождались ненужные соединения после всплеска использования, который вызывает большой Размер бассейна. Вы можете добиться этого, установив maxIdleTimeExcessConnections к значению намного короче, чем maxIdleTime, принудительное отключение Соединений сверх установленного минимального размера, если они простаивают более короткое время.

Несколько общих советов по всем этим параметрам тайм-аута. Точка подключения пула состоит в том, чтобы нести расходы на приобретение Соединение только один раз, а затем повторно использовать Соединение много, много раз. Большинство баз данных поддерживают соединения, которые остаются открытыми в течение нескольких часов вовремя. Там нет необходимости перетекать все ваши соединения каждый несколько секунд или минут. Установка maxConnectionAge или maxIdleTime в 1800 (30 минут) довольно агрессивно. Для большинства баз данных несколько часы могут быть более подходящими. Вы можете обеспечить надежность вашего Связи, проверяя их, а не бросая их. (увидеть Настройка тестирования соединения.) Единственный из этих параметров, который как правило, должно быть установлено на несколько минут или меньше maxIdleTimeExcessConnections.

...