#load-balancing #weblogic9.x #session-state-server
#балансировка нагрузки #weblogic9.x #сервер состояния сеанса
Вопрос:
У меня настроено 2 независимых сервера WebLogic 9.2.1 (они являются управляемыми серверами с собственным сервером администратора). Таким образом, кластеризация не была настроена. Они настроены на сохранение сеанса JDBC. Кроме того, каждый из серверов WebLogic имеет свой собственный интерфейс Apache 2 с подключаемым модулем WebLogic, перенаправляющим трафик только на соответствующий сервер WebLogic. Перед серверами Apache 2 у меня есть аппаратный балансировщик нагрузки. В настоящее время мы получаем нарушения ограничений из базы данных Oracle, в которой размещена таблица, используемая для сохранения сеанса.
Я обнаружил, что аппаратный балансировщик нагрузки использует липкие IP-адреса (поэтому сеансы в результате также должны быть липкими). Но это ускользает от меня, что не так в настройке?
Журнал WebLogic:
####<26 апреля 2011 13:00:08.0428 CEST> <Ошибка> <HTTP-сессия> <sktpens01por02> <SktEnsPorServer1> <[АКТИВНЫЙ] ExecuteThread: '230' для очереди: 'weblogic.kernel.По умолчанию (самонастраивается)'> <skatGuid=6fa90948-b285-45a5-954b-45e22bfc26c2, подразделение = company, подразделение= external, подразделение= entities, dc=skat, dc=dk> <> <> <1303815608428> <BEA-100087> <Данные сеанса jdbc для идентификатора сеанса: lZbJN2jTbPZjTf81vSrKytxDdYCpwTgblJhnck3RhTcPf3FQr1Pw ctx: исходный dblat: 1303815595796 triggerLAT:0 был изменен другим сервером в кластере. java.sql.SQLException: ORA-00001: нарушено уникальное ограничение (FRONTSESSIONS.SYS_C0056504) в oracle.jdbc.driver.Ошибка базы данных.Исключение throwSqlException (ошибка базы данных.java: 112) в oracle.jdbc.driver.Ошибка T4CTTIoer.Processor(T4CTTIoer.java:331) в oracle.jdbc.driver.Ошибка T4CTTIoer.Processor(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.оболочке.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.выполнить(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) > ####<26 апреля 2011 13:00:08.0436 CEST> <Ошибка> <HTTP-сессия> <sktpens01por02> <SktEnsPorServer1> <[АКТИВНЫЙ] ExecuteThread: '230' для очереди: 'weblogic.kernel.По умолчанию (самонастраивается)'> <skatGuid=6fa90948-b285-45a5-954b-45e22bfc26c2, подразделение = company, подразделение= external, подразделение= entities, dc=skat, dc=dk> <> <> <1303815608436> <BEA-100060> <При получении сеанса для веб-приложения: weblogic.servlet.internal произошла непредвиденная ошибка.WebAppServletContext@26f86bfb - AppName: 'Portal-Front', имя: 'front', контекстный путь: '/front'. java.sql.SQLException: ORA-00001: нарушено уникальное ограничение (FRONTSESSIONS.SYS_C0056504) в oracle.jdbc.driver.Ошибка базы данных.Исключение throwSqlException (ошибка базы данных.java: 112) в oracle.jdbc.driver.Ошибка T4CTTIoer.Processor(T4CTTIoer.java:331) в oracle.jdbc.driver.Ошибка T4CTTIoer.Processor(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.оболочке.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.выполнить(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" ;
Спасибо!
Комментарии:
1. можете ли вы опубликовать фактическое сообщение об ошибке Oracle и определение таблицы?
2. Вставленный журнал WebLogic и определение таблицы.
3. Я получаю точно такое же исключение, кто-нибудь может помочь, пожалуйста?
Ответ №1:
Тот факт, что это 2 независимых сервера (без кластеризации в смысле WebLogic), не мешает WebLogic генерировать одинаковые идентификаторы для сеансов. Если эти 2 сервера находятся в кластере, то WebLogic добавит идентификатор узла как часть идентификатора сеанса. Но, поскольку серверы не входят в кластер, конечно, есть шанс, что в какой-то момент они сгенерируют тот же идентификатор сеанса.
Единственный способ избежать этого исключения — настроить оба сервера на использование разных таблиц или базы данных для хранения сеанса.