当查询同一个 Oracle 数据库时,JDBC 语句中的 SYSDATE 似乎返回不同的时间

我们有 3 到 4 个设置相同的环境,每个环境都有多个集群应用服务器 (WebSphere) 和 Oracle Supercluster 数据库。

我看到的问题似乎只发生在大约 20% 的环境之一中

我们有

  • 部署到同一个应用服务器集群的两个应用

  • 这两个应用程序使用相同的数据源,该数据源配置为使用 Oracle 数据库,即 Oracle Supercluster。

以下是有问题的表的结构

TABLE SESSION_TBL 

(

    ID NUMBER(12, 0) NOT NULL, 

    USER_ID VARCHAR2(256 BYTE) NOT NULL, 

    SESSION_ID VARCHAR2(60 BYTE) NOT NULL, 

    LOGIN_TIME TIMESTAMP(6) NOT NULL 

 ) 

应用程序 1 使用 JDBC 存储记录


    String sql = "Insert into SESSION_TBL " +

                 "  (USER_ID, SESSION_ID, LOGIN_TIME ) " +

                 "  values (?,?,SYSDATE)";


    try

    {

        sessionId = getNewSessionId(userId);

        st = conn.prepareStatement(sql);

        st.setString(1, userId);

        st.setString(2, sessionId);

        int rows = st.executeUpdate();

    }

几秒钟后,应用程序2执行以下代码查找第一个应用程序插入的记录并与当前时间进行比较


Statement st = null;

ResultSet result = null;


String sql = " Select * " +

" from SESSION_TBL " +

" where USER_ID = '" + userId + "' " +

" and SESSION_ID = '" + sessionId + "' ";


try {

    st = conn.createStatement();

    result = st.executeQuery(sql);


    if(!result.next()) { // We have no data, need to expire the session

        logger.debug("End hasSessionExpired()");

        return true;

    }

    else {

         logger.debug("SessionInfo:ResultSet not null");

    }

如果您注意到一件事,列的数据类型 (LOGIN_TIME) 是时间戳,我正在使用 SYSDATE 来填充它。但是,我也使用 SYSDATE 从 DUAL 获取时间。在我们拥有的 4 个环境中,这发生在一个环境中,但并非总是如此。代码中是否有问题,或者数据库 Oracle 超级集群是否可能实际上返回了不正确的日期。


红糖糍粑
浏览 58回答 1
1回答

郎朗坤

我想我会给出一个答案,以防其他人遇到类似的问题。正如人们所建议的(在评论中)集群节点时间可能不同步。我们在集群中有 2 个节点,一个节点领先(当前时间)几分钟。可以通过对每个节点运行 SYSDATE 查询来检测时间是否不同步。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java