У меня есть spring/jdbc/oracle 10-граммовое приложение. Часовой пояс базы данных сервера Oracle установлен на GMT +, 2 часовыми поясами JVM является GMT + 2 (даже при том, что он не имеет значения в моем случае).
У меня есть хранимая процедура, которая выполняет некоторые операции даты. Проблема состоит в том, что часовой пояс сессии отличается (GMT), чем часовой пояс базы данных даже при том, что я не устанавливаю часовой пояс сессии, явный в моем коде/конфигурации.
Насколько я знаю, что часовой пояс сессии по умолчанию равен часовому поясу базы данных. Какая-либо идея, почему часовой пояс сессии отличается, чем часовой пояс базы данных или как я могу настроить его в пружинной конфигурации (org.apache.commons.dbcp. BasicDataSource)?
Спасибо.
Правильный способ - использовать DelegatingDataSource
, получить объект OracleConnection
из исходного источника данных и вызвать OracleConnection.setSessionTimeZone ()
с соответствующим параметром.
Код C3P0 выглядит так:
private Object[] timeZoneArgs = new Object[] { "Europe/Berlin" };
@Override
public Connection getConnection() throws SQLException {
Connection conn = super.getConnection();
try {
final Method setSessionTimeZoneMethod = OracleConnection.class.getMethod("setSessionTimeZone", String.class);
final C3P0ProxyConnection castCon = (C3P0ProxyConnection) conn;
castCon.rawConnectionOperation(setSessionTimeZoneMethod, C3P0ProxyConnection.RAW_CONNECTION, timeZoneArgs);
return conn;
} catch (Exception e) {
log.error("setSessionTimeZone failed " + e.getMessage());
return conn;
}
}