1

我设置了 2 个独立的 WebLogic 9.2.1 服务器(它们是具有自己的管理服务器的托管服务器)。所以没有设置集群。它们配置有 JDBC 会话持久性。此外,每个 WebLogic 服务器都有自己的 Apache 2 前端,WebLogic 插件仅将流量转发到它们各自的 WebLogic 服务器。在 Apache 2 服务器前面,我有一个硬件负载均衡器。目前,我们正在从托管用于会话持久性的表的 Oracle 数据库中获取约束违规。

我发现硬件负载平衡器正在使用粘性 IP(因此会话也应该是粘性的)。但它让我无法理解设置中有什么问题?

WebLogic 日志:

####<Apr 26, 2011 13:00:08.0428 CEST> <Error> <HTTP Session> <sktpens01por02> <SktEnsPorServer1> <[ACTIVE] ExecuteThread: '230' for queue: 'weblogic.kernel.Default (self-调整)'> <skatGuid=6fa90948-b285-45a5-954b-45e22bfc26c2,ou=company,ou=external,ou=entities,dc=skat,dc=dk> <> <> <1303815608428> <BEA-100087> <会话 id 的 jdbc 会话数据:lZbJN2jTbPZjTf81vSrKytxDdYCpwTgblJhnck3RhTcPf3FQr1Pw ctx:front dblat:1303815595796 triggerLAT:0 已被集群中的另一台服务器修改。
java.sql.SQLException: ORA-00001: 违反唯一约束 (FRONTSESSIONS.SYS_C0056504)

    在 oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:112)
    在 oracle.jdbc.driver.T4CTTIoer.processError(T4CTTIoer.java:331)
    在 oracle.jdbc.driver.T4CTTIoer.processError(T4CTTIoer.java:288)
    在 oracle.jdbc.driver.T4C8Oall.receive(T4C8Oall.java:745)
    在 oracle.jdbc.driver.T4CPreparedStatement.doOall8(T4CPreparedStatement.java:219)
    在 oracle.jdbc.driver.T4CPreparedStatement.executeForRows(T4CPreparedStatement.java:970)
    在 oracle.jdbc.driver.OracleStatement.doExecuteWithTimeout(OracleStatement.java:1190)
    在 oracle.jdbc.driver.OraclePreparedStatement.executeInternal(OraclePreparedStatement.java:3370)
    在 oracle.jdbc.driver.OraclePreparedStatement.executeUpdate(OraclePreparedStatement.java:3454)
    在 weblogic.jdbc.wrapper.PreparedStatement.executeUpdate(PreparedStatement.java:128)
    在 weblogic.servlet.internal.session.JDBCSessionData.dbCreate(JDBCSessionData.java:181)
    在 weblogic.servlet.internal.session.JDBCSessionData.dbUpdate(JDBCSessionData.java:242)
    在 weblogic.servlet.internal.session.JDBCSessionData.syncSession(JDBCSessionData.java:583)
    在 weblogic.servlet.internal.session.JDBCSessionContext.sync(JDBCSessionContext.java:232)
    在 weblogic.servlet.internal.ServletRequestImpl$SessionHelper.syncSession(ServletRequestImpl.java:2507)
    在 weblogic.servlet.internal.ServletRequestImpl$SessionHelper.syncSession(ServletRequestImpl.java:2482)
    在 weblogic.servlet.internal.ServletResponseImpl$1.run(ServletResponseImpl.java:1308)
    在 weblogic.security.acl.internal.AuthenticatedSubject.doAs(AuthenticatedSubject.java:321)
    在 weblogic.security.service.SecurityManager.runAs(SecurityManager.java:121)
    在 weblogic.servlet.internal.ServletResponseImpl.send(ServletResponseImpl.java:1302)
    在 weblogic.servlet.internal.ServletRequestImpl.run(ServletRequestImpl.java:1368)
    在 weblogic.work.ExecuteThread.execute(ExecuteThread.java:209)
    在 weblogic.work.ExecuteThread.run(ExecuteThread.java:181)
>
####<Apr 26, 2011 13:00:08.0436 CEST> <Error> <HTTP Session> <sktpens01por02> <SktEnsPorServer1> <[ACTIVE] ExecuteThread: '230' for queue: 'weblogic.kernel.Default (self-调整)'> <skatGuid=6fa90948-b285-45a5-954b-45e22bfc26c2,ou=company,ou=external,ou=entities,dc=skat,dc=dk> <> <> <1303815608436> <BEA-100060> <检索 Web 应用程序的会话时发生意外错误:weblogic.servlet.internal.WebAppServletContext@26f86bfb - appName:'Portal-Front',名称:'front',上下文路径:'/front'。
java.sql.SQLException: ORA-00001: 违反唯一约束 (FRONTSESSIONS.SYS_C0056504)

    在 oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:112)
    在 oracle.jdbc.driver.T4CTTIoer.processError(T4CTTIoer.java:331)
    在 oracle.jdbc.driver.T4CTTIoer.processError(T4CTTIoer.java:288)
    在 oracle.jdbc.driver.T4C8Oall.receive(T4C8Oall.java:745)
    在 oracle.jdbc.driver.T4CPreparedStatement.doOall8(T4CPreparedStatement.java:219)
    在 oracle.jdbc.driver.T4CPreparedStatement.executeForRows(T4CPreparedStatement.java:970)
    在 oracle.jdbc.driver.OracleStatement.doExecuteWithTimeout(OracleStatement.java:1190)
    在 oracle.jdbc.driver.OraclePreparedStatement.executeInternal(OraclePreparedStatement.java:3370)
    在 oracle.jdbc.driver.OraclePreparedStatement.executeUpdate(OraclePreparedStatement.java:3454)
    在 weblogic.jdbc.wrapper.PreparedStatement.executeUpdate(PreparedStatement.java:128)
    在 weblogic.servlet.internal.session.JDBCSessionData.dbCreate(JDBCSessionData.java:181)
    在 weblogic.servlet.internal.session.JDBCSessionData.dbUpdate(JDBCSessionData.java:242)
    在 weblogic.servlet.internal.session.JDBCSessionData.syncSession(JDBCSessionData.java:583)
    在 weblogic.servlet.internal.session.JDBCSessionContext.sync(JDBCSessionContext.java:232)
    在 weblogic.servlet.internal.ServletRequestImpl$SessionHelper.syncSession(ServletRequestImpl.java:2507)
    在 weblogic.servlet.internal.ServletRequestImpl$SessionHelper.syncSession(ServletRequestImpl.java:2482)
    在 weblogic.servlet.internal.ServletResponseImpl$1.run(ServletResponseImpl.java:1308)
    在 weblogic.security.acl.internal.AuthenticatedSubject.doAs(AuthenticatedSubject.java:321)
    在 weblogic.security.service.SecurityManager.runAs(SecurityManager.java:121)
    在 weblogic.servlet.internal.ServletResponseImpl.send(ServletResponseImpl.java:1302)
    在 weblogic.servlet.internal.ServletRequestImpl.run(ServletRequestImpl.java:1368)
    在 weblogic.work.ExecuteThread.execute(ExecuteThread.java:209)
    在 weblogic.work.ExecuteThread.run(ExecuteThread.java:181)
>

Oracle 表定义:

CREATE TABLE "FRONTSESSIONS"."WL_SERVLET_SESSIONS"
  (
    "WL_ID"           VARCHAR2(100 BYTE) NOT NULL ENABLE,
    "WL_CONTEXT_PATH" VARCHAR2(100 BYTE) NOT NULL ENABLE,
    "WL_IS_NEW"       CHAR(1 BYTE),
    "WL_CREATE_TIME"  NUMBER(20,0),
    "WL_IS_VALID"     CHAR(1 BYTE),
    "WL_SESSION_VALUES" LONG RAW,
    "WL_ACCESS_TIME"           NUMBER(20,0),
    "WL_MAX_INACTIVE_INTERVAL" NUMBER(*,0),
    PRIMARY KEY ("WL_ID", "WL_CONTEXT_PATH") USING INDEX PCTFREE 10 INITRANS 2 MAXTRANS 255 COMPUTE STATISTICS STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645 PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1 BUFFER_POOL DEFAULT) TABLESPACE "FRONTSESSIONS" ENABLE
  )
  PCTFREE 10 PCTUSED 40 INITRANS 1 MAXTRANS 255 NOCOMPRESS LOGGING STORAGE
  (
    INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645 PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1 BUFFER_POOL DEFAULT
  )
  TABLESPACE "FRONTSESSIONS" ;

谢谢!

4

1 回答 1

0

这些是 2 个独立服务器(在 WebLogic 意义上没有集群)这一事实并不会阻止 WebLogic 为会话生成相同的 id。如果这 2 台服务器位于集群中,则 WebLogic 会将节点 ID 添加为会话 ID 的一部分。但是因为服务器不在集群中,当然,它们有可能在某些时候生成相同的会话 id。

避免该异常的唯一方法是将两台服务器配置为使用不同的表或数据库进行会话存储。

于 2011-10-27T21:54:03.280 回答