我设置了 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" ;
谢谢!