[英]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.