2011-04-20 90 views
1

我有2個獨立的WebLogic 9.2.1服務器(它們是具有自己的管理服務器的託管服務器)的設置。所以沒有建立羣集。它們使用JDBC會話持久性配置。此外,每個WebLogic服務器都有自己的Apache 2前端,而WebLogic插件僅將流量轉發到其各自的WebLogic服務器。 在Apache 2服務器之前,我有一個硬件負載平衡器。 目前,我們從主持用於會話持久性的表的Oracle數據庫中獲取約束違規。WebLogic 9.2負載平衡問題

我發現硬件負載平衡器使用粘性IP(因此會話也應該是粘性的)。但它逃脫了我在設置中出了什麼問題?

的WebLogic日誌:

 
####<Apr 26, 2011 13:00:08.0428 CEST> <Error> <HTTP Session> <sktpens01por02> <SktEnsPorServer1> <[ACTIVE] ExecuteThread: '230' for queue: 'weblogic.kernel.Default (self-tuning)'> <skatGuid=6fa90948-b285-45a5-954b-45e22bfc26c2,ou=company,ou=external,ou=entities,dc=skat,dc=dk> <> <> <1303815608428> <BEA-100087> <The jdbc session data for session id: lZbJN2jTbPZjTf81vSrKytxDdYCpwTgblJhnck3RhTcPf3FQr1Pw ctx:front dblat:1303815595796 triggerLAT:0 has been modified by another server in the cluster. 
java.sql.SQLException: ORA-00001: unique constraint (FRONTSESSIONS.SYS_C0056504) violated 

    at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:112) 
    at oracle.jdbc.driver.T4CTTIoer.processError(T4CTTIoer.java:331) 
    at oracle.jdbc.driver.T4CTTIoer.processError(T4CTTIoer.java:288) 
    at oracle.jdbc.driver.T4C8Oall.receive(T4C8Oall.java:745) 
    at oracle.jdbc.driver.T4CPreparedStatement.doOall8(T4CPreparedStatement.java:219) 
    at oracle.jdbc.driver.T4CPreparedStatement.executeForRows(T4CPreparedStatement.java:970) 
    at oracle.jdbc.driver.OracleStatement.doExecuteWithTimeout(OracleStatement.java:1190) 
    at oracle.jdbc.driver.OraclePreparedStatement.executeInternal(OraclePreparedStatement.java:3370) 
    at oracle.jdbc.driver.OraclePreparedStatement.executeUpdate(OraclePreparedStatement.java:3454) 
    at weblogic.jdbc.wrapper.PreparedStatement.executeUpdate(PreparedStatement.java:128) 
    at weblogic.servlet.internal.session.JDBCSessionData.dbCreate(JDBCSessionData.java:181) 
    at weblogic.servlet.internal.session.JDBCSessionData.dbUpdate(JDBCSessionData.java:242) 
    at weblogic.servlet.internal.session.JDBCSessionData.syncSession(JDBCSessionData.java:583) 
    at weblogic.servlet.internal.session.JDBCSessionContext.sync(JDBCSessionContext.java:232) 
    at weblogic.servlet.internal.ServletRequestImpl$SessionHelper.syncSession(ServletRequestImpl.java:2507) 
    at weblogic.servlet.internal.ServletRequestImpl$SessionHelper.syncSession(ServletRequestImpl.java:2482) 
    at weblogic.servlet.internal.ServletResponseImpl$1.run(ServletResponseImpl.java:1308) 
    at weblogic.security.acl.internal.AuthenticatedSubject.doAs(AuthenticatedSubject.java:321) 
    at weblogic.security.service.SecurityManager.runAs(SecurityManager.java:121) 
    at weblogic.servlet.internal.ServletResponseImpl.send(ServletResponseImpl.java:1302) 
    at weblogic.servlet.internal.ServletRequestImpl.run(ServletRequestImpl.java:1368) 
    at weblogic.work.ExecuteThread.execute(ExecuteThread.java:209) 
    at 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-tuning)'> <skatGuid=6fa90948-b285-45a5-954b-45e22bfc26c2,ou=company,ou=external,ou=entities,dc=skat,dc=dk> <> <> <1303815608436> <BEA-100060> <An unexpected error occurred while retrieving the session for Web application: [email protected] - appName: 'Portal-Front', name: 'front', context-path: '/front'. 
java.sql.SQLException: ORA-00001: unique constraint (FRONTSESSIONS.SYS_C0056504) violated 

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

謝謝!

+0

你可以發佈實際的Oracle錯誤消息和表定義嗎? – JoseK 2011-05-04 10:36:36

+0

粘貼WebLogic日誌和表定義。 – neko 2011-05-09 10:23:21

+0

我得到完全相同的例外,有人可以幫忙嗎? – ipolevoy 2011-06-06 16:07:49

回答

0

這些事實是那些是2個獨立的服務器(沒有WebLogic意義上的集羣)並不會停止WebLogic爲會話生成相同的ID。如果這些服務器位於集羣中,那麼WebLogic會將節點標識添加爲會話標識的一部分。但是,因爲服務器不在集羣中,當然有可能在某些時候生成相同的會話ID。

避免該異常的唯一方法是將兩臺服務器配置爲使用不同的表或數據庫進行會話存儲。