我有一个spring / jdbc / oracle 10g应用程序。 Oracle服务器数据库时区设置为GMT + 2 JVM时区为GMT + 2(即使在我的情况下无关紧要)。
我有一个执行某些日期操作的存储过程。问题是会话时区与数据库时区不同(GMT),即使我没有在我的代码/配置中明确设置会话时区。
据我所知,会话时区默认等于数据库时区。知道为什么会话时区与数据库时区不同,或者如何在spring配置中配置它(org.apache.commons.dbcp.BasicDataSource)?
谢谢。
答案 0 :(得分:6)
正确的方法是使用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;
}
}
答案 1 :(得分:1)
我通过将Oracle的JDBC驱动程序从v10.2.0.1.0升级到v11.2.0.3来解决了这个问题。不需要更改我的java代码。
来源:Spring forums。
答案 2 :(得分:0)
在春季配置中,在运行应用程序之前添加以下VM选项:
<script src="https://code.jquery.com/jquery-1.12.4.min.js"
integrity="sha256-ZosEbRLbNQzLpnKIkEdrPv7lOy9C27hHQ+Xp8a4MxAQ="
crossorigin="anonymous"></script>
<h3> click two point to draw a line :</h3>
<div id="demo" class="wide">
</div>
还要确保您的pom具有最新的jdbc驱动程序
-Duser.timezone=EDT