【问题标题】:Setting session timezone with spring jdbc oracle使用 spring jdbc oracle 设置会话时区
【发布时间】:2011-02-17 20:28:54
【问题描述】:

我有一个 spring/jdbc/oracle 10g 应用程序。 Oracle 服务器数据库时区设置为 GMT + 2 JVM 时区为 GMT + 2(尽管在我的情况下这无关紧要)。

我有一个执行一些日期操作的存储过程。问题是会话时区与数据库时区不同(GMT),即使我没有在我的代码/配置中明确设置会话时区。

据我所知,会话时区默认等于数据库时区。知道为什么会话时区与数据库时区不同,或者如何在 spring 配置 (org.apache.commons.dbcp.BasicDataSource) 中配置它?

谢谢。

【问题讨论】:

  • 您指的是哪个会话? Oracle 连接会话,还是 HTTP 会话?我猜是前者?
  • 这解决了你的问题?我需要在 MySQL 上做同样的事情,我还在寻找如何去做!
  • 我有问题/帖子停留在这个 DEAD 模式!!没有答案,没有确认,没有猜测!!

标签: java oracle spring jdbc timezone


【解决方案1】:

正确的方法是使用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;
    }
}

【讨论】:

    【解决方案2】:

    我通过将 Oracle 的 JDBC 驱动程序从 v10.2.0.1.0 升级到 v11.2.0.3 解决了这个问题。不需要更改我的 java 代码。

    来源:Spring forums

    【讨论】:

      【解决方案3】:

      在 spring 配置中,在运行应用程序之前添加以下 VM 选项:

      -Duser.timezone=EDT
      

      还要确保你的 pom 有最新的 jdbc 驱动程序

      <dependency>
          <groupId>com.oracle</groupId>
          <artifactId>ojdbc8</artifactId>
          <version>12.2.0.1</version>
      </dependency>
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-10-12
        • 2011-07-20
        • 2013-09-22
        • 2011-05-06
        • 1970-01-01
        • 2019-01-04
        相关资源
        最近更新 更多