Установка часового пояса соединения с Spring и DBCP и MySQL - PullRequest
13 голосов
/ 12 мая 2011

Моя среда

  • Java 5
  • Spring 2.5.5
  • DBCP DataSource (org.apache.commons.dbcp.BasicDataSource)
  • MySQL

Похожие записи

Ссылки

Моя проблема

  • Мне нужно установить в моем соединении часовой пояс, чтобы предотвратить преобразования при работе со столбцами TIMESTAMP.

Моя идея / исследование

  • Пул соединений с DBCP ничего не сказал о часовом поясе. ССЫЛКА

  • То, что я исследовал и думал, что это было хорошо, описано на ЭТОМ посте, например:

<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource"
    destroy-method="close">
    <property name="URL" value="${database.url}" /> 
    <property name="user" value="${database.username}" /> 
    <property name="password" value="${database.passwd}" /> 
    <property name="connectionCachingEnabled" value="true"/>
    <property name="sessionTimeZone" value="GMT-3"/>
</bean>

Обращение за помощью:)

  • Но это не работает !!
  • То, что я хочу здесь, это простой способ,предпочтительно использовать Spring для настройки часового пояса при подключении jdbc.

Заранее благодарим за любую помощь / советы / советы / обмен знаниями


РЕШЕНИЕ:

Мое решение основано на советах, собранных в этом посте!Спасибо за все!

(...)
@Override
public Connection getConnection() {
    Connection conn = null;
    Statement statement = null;
    try {
        conn = super.getConnection();
        statement = conn.createStatement();
        statement.execute("SET time_zone = \'" + timezone+"\'");
    } catch (SQLException e) {
        LOG.fatal("Error while SET time_zone", e);
    } finally {
        try {
            statement.close();
        } catch (SQLException e) {
            LOG.warn("Error while closing statement", e);
        }
    }
    if(LOG.isDebugEnabled())
        LOG.debug("SET time_zone("+timezone+") for connection, succeed!");
    return conn;
}
(...)

и в моем файле конфигурации Spring:

<bean id="dataSource" class="com.my.package.dbcp.TimezoneEnabledDataSource" destroy-method="close">
    (...)
    <property name="timezone" value="${database.timezone}" />
    (...)
</bean>

Я надеюсь, что этот пост может помочь кому-то в будущем.Любой вопрос пингует меня!

Ответы [ 4 ]

7 голосов
/ 08 июня 2011

Вы должны иметь возможность помещать те же операторы SQL в свойство initConnectionSqls элемента конфигурации DBCP. Просто добавьте это к элементу конфигурации DBCP

<property name="initConnectionSqls" value="SET time_zone = '${database.timezone}'"/>

В зависимости от вашей версии DBCP, вам может понадобиться использовать connectionInitSqls в качестве имени свойства. Эта информация взята из конфигурации DBCP документации.

6 голосов
/ 12 мая 2011

Если у источника данных нет такого свойства, вы можете расширить его и добавить это свойство:

public TimezoneEnabledDataSource extends BasicDataSource {
    private String timezone;
    //getter and setter for it

    @Override    
    public Connection getConnection() {
        Connection c = super.getConnection();
        // execute a query: SET time_zone = '-8:00'
        return c;
    }
}

Подробнее о запросе см. Здесь http://www.electrictoolbox.com/mysql-set-timezone-per-connection/.

В документации по MySQL :

Часовые пояса для каждого соединения. Каждый клиент, который подключается, имеет собственную настройку часового пояса, заданную переменной time_zone сессии. Первоначально переменная сеанса берет свое значение из глобальной переменной time_zone, но клиент может изменить свой собственный часовой пояс с помощью следующего оператора:

mysql> SET time_zone = часовой пояс;

Вы также можете проверить, если c3p0 не имеет чего-то встроенного.

0 голосов
/ 09 августа 2018

Одно из возможных решений:

<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource"
    destroy-method="close">
    <property name="URL" value="${database.url}?serverTimezone=America/Los_Angeles" /> 
    <property name="user" value="${database.username}" /> 
    <property name="password" value="${database.passwd}" /> 
    <property name="connectionCachingEnabled" value="true"/>
    <property name="sessionTimeZone" value="GMT-3"/>
</bean>
0 голосов
/ 12 мая 2011

В BasicDataSource нет члена "sessionTimeZone".Используйте C3P0, который является «лучшим» пулом соединений, чем DBCP, или даже лучше, если вы находитесь на веб-сервере Java EE, используйте его для инициализации источника данных JNDI;)

...