为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

红糖糍粑 2021-11-03 10:52:34
我们有 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 超级集群是否可能实际上返回了不正确的日期。
查看完整描述

1 回答

?
郎朗坤

TA贡献1921条经验 获得超9个赞

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


查看完整回答
反对 回复 2021-11-03
  • 1 回答
  • 0 关注
  • 57 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信