2014-01-30 2 views
1

Я пытаюсь настроить кластер Tomcat 7 с репликацией сеанса.Репликация сеанса с причиной Spring NotSerializableException

Я использовал this tutorial и все отлично работает на тестовых сервлетах, которые находятся в примерах tomcat. http://localhost/examples/servlets/servlet/SessionExample.

Поэтому я добавил некоторые атрибуты, а затем остановил один из узлов, и сеанс был реплицирован успешно.

Но когда я перехожу эту конфигурацию моего приложения с спящим + Spring MVC + пружинной безопасностью, и когда я попытался войти в Я всегда получаю исключение,

SEVERE: Unable to serialize delta request for sessionid [69845CF0E87B3F0F64FB605FAC1D4987.node1] 
java.io.NotSerializableException: org.apache.commons.dbcp.BasicDataSource 

Всех мои объекты сессий Реализовать Serializable интерфейса , в web.xml Я добавил Я пробовал сделать EntityManager поле временное, но это не помогает. Я думаю, что это может быть то, что весна пытается сэкономить некоторые бобовые на сеанс, но я искал проект и не нашел никаких бонусов с сессией.

Есть ли у кого-нибудь идеи, как справиться с этой проблемой?

UPD:

public abstract class AbstractDAOImpl<E, I> implements AbstractDAO<E, I> { 

    private static final long serialVersionUID = 7372882616977337461L; 

    @PersistenceContext 
    protected transient EntityManager entityManager; 

applicationContext.xml

<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" 
    p:driverClassName="${jdbc-driver}" p:url="${jdbc-db-url}" p:username="${jdbc-db-username}" 
    p:password="${jdbc-db-passwd}" p:testWhileIdle="true" 
    p:timeBetweenEvictionRunsMillis="7200000" p:validationQuery="select 1;" 
    destroy-method="close" /> 


    <bean id="entityManagerFactory" 
     class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean"> 
     <property name="persistenceUnitName" value="MIQlocal" /> 
     <property name="dataSource" ref="dataSource" /> 
     <property name="jpaDialect" ref="jpaDialect" /> 
     <property name="jpaVendorAdapter" ref="jpaVendorAdapter" /> 
     <property name="loadTimeWeaver"> 
      <bean class="org.springframework.instrument.classloading.InstrumentationLoadTimeWeaver" /> 
     </property> 
    </bean> 

    <bean id="transactionManager" name="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager"> 
     <property name="entityManagerFactory" ref="entityManagerFactory" /> 
     <property name="dataSource" ref="dataSource" /> 
    </bean> 

ответ

0

Ваш источник данных не Сериализуемый.

Сделайте свое поле класса, которое является экземпляром org.apache.commons.dbcp.BasicDataSourcetransient и убедитесь, что оно введено весной, и все готово.

Редактировать: только сейчас я вижу, что у вас есть, что привело к переходному процессу EntityManager, поэтому я должен попросить вас предоставить соответствующий код, если это возможно.

+0

Конечно, я редактировал свой пост. Извините из-за политики компании, я не могу поделиться всем кодом. Если это еще не все - скажите мне, и я дам дополнительный код. – Roston

+0

спасибо! Ну, теперь, когда очевидная причина в том, что ... Возможно, вы каким-то образом сохраните 'entityManager' в другом месте вашего кода (например, вы создаете второй объект и передаете и сохраняете' entityManager' в своем конструкторе), или каким-то другим образом вы сохраняете ссылку на конкретный экземпляр 'entityManager'? – ljgw

+0

Спасибо, я нашел несколько мест, где EntityManager не был преходящим, и я сделал его преходящим. Проблема все еще появляется. Я попытаюсь найти DAO, которые не реализуют Serializable. – Roston

Смежные вопросы