WebLogic 9.2 Проблема балансировки нагрузки - PullRequest
1 голос
/ 20 апреля 2011

У меня есть 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-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: weblogic.servlet.internal.WebAppServletContext@26f86bfb - 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" ;

Спасибо!

1 Ответ

0 голосов
/ 28 октября 2011

Тот факт, что это 2 независимых сервера (без кластеризации в смысле WebLogic), не мешает WebLogic генерировать идентичные идентификаторы для сеансов.Если эти 2 сервера находятся в кластере, то WebLogic добавит идентификатор узла как часть идентификатора сеанса.Но поскольку серверы не входят в кластер, конечно, есть вероятность, что в какой-то момент они сгенерируют одинаковый идентификатор сеанса.

Единственный способ избежать этого исключения - настроить оба сервера на использование разных таблиц.или база данных для хранения сеанса.

...