我们有 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 超级集群是否可能实际上返回了不正确的日期。
郎朗坤
相关分类