Установка временной зоны соединения с помощью Spring и DBCP и MySQL

My Enviroment

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

Похожие сообщения

Ссылки

Моя проблема

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

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

  • Пул соединений DBCP ничего не упоминал о часовом поясе. LINK

  • Что я изучаю и думал, что это oK, описано в ЭТО, примером является:

<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>

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

Ответ 1

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

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:

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

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

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

Ответ 2

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

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

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

Ответ 3

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