Установка временной зоны соединения с помощью 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;)