Репликация сеанса Tomcat - не сериализованное исключение - PullRequest
1 голос
/ 15 сентября 2009

Я сейчас работаю над одним грязным веб-приложением. В этом приложении есть класс, который содержит все источники данных. И когда нужно подключиться к конкретному источнику данных, метод в экземпляре класса вызывается с параметром для выбора источника данных. И класс выглядит следующим образом

   public class MyConnection implements Runnable,DbConnection, Serializable
   { 
       private static final long serialVersionUID=2007L;
       public static transient DataSource FirstDatasource;
       public static transient DataSource SecondDatasource;
           BaseDbConnection _bidc;
           ....

И на каждой странице этот объект получают и устанавливают на сессию (я не знаю, почему так). И это прекрасно работает с текущей настройкой. (кластеризация, балансировка нагрузки и т. д.)

Но моя работа состоит в том, чтобы реализовать отработку отказа, и когда я включаю репликацию сеанса (в памяти - простой протокол tcp), запись сеанса завершается сбоем, и его выбрасывает после исключения

 org.apache.catalina.ha.session.DeltaManager requestCompleted
 SEVERE: Unable to serialize delta request for sessionid [FE02AF01C76F41D042FE04692462D983.tomcat1]
 java.io.NotSerializableException: org.apache.tomcat.dbcp.dbcp.PoolingDataSource$PoolGuardConnectionWrapper
 at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1081)
 at java.io.ObjectOutputStream.defaultWriteFields(ObjectOutputStream.java:1375)
 .....

Поскольку страниц больше, чем «Я могу сосчитать», нелегко заменить код, который устанавливает объект соединения в сеансе для каждой страницы. И все приложение основано на этом объекте соединения (источники данных также играют важную роль).

Есть ли способ, которым я могу изменить этот класс, чтобы он мог сохраняться в сеансе?

Заранее спасибо

1 Ответ

2 голосов
/ 15 сентября 2009

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

Что нужно сделать, это после десериализации, чтобы получить новый (локальный) источник данных , который соответствует потребности, и установить его в поле. Возможно, это уже происходит в вашем коде, ищите метод readResolve.

Если некоторые параметры необходимы для того, чтобы узнать, какой источник данных, они могут быть сериализованы сами (поскольку они не являются источником данных, они могут быть просто строками, например)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...