繁体   English   中英

tomcat 会话复制 - 未序列化异常

[英]tomcat session replication - not serialized exception

我目前正在开发一个凌乱的 Web 应用程序。 在这个应用程序中,有一个包含所有数据源的类。 并且每当需要连接到特定的数据源时,都会调用类实例中的方法,带参数选择数据源。类如下

   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)
 .....

由于页面数量超过“我可以计算”的数量,因此从每个页面替换在会话中设置连接对象的代码并不容易。 而完整的应用程序就是基于这个连接对象(数据源也起着重要的作用)。

有没有办法可以更改这个类,以便它可以在会话中持久化?

如果我理解正确,我会说复制 DataSource 是不正确的,它无法工作。

需要做的是,反序列化后,得到一个新的(本地)对应需要的DataSource ,并在字段中设置。 这可能已经在您的代码中发生了,请查找readResolve方法。

如果需要一些参数来知道哪个数据源,它们可以自己序列化(因为它们不是数据源,例如它们可能只是字符串)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM