代码之家  ›  专栏  ›  技术社区  ›  Umesh

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

  •  1
  • Umesh  · 技术社区  · 15 年前

    我目前正在开发一个杂乱的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)
     .....
    

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

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

    提前谢谢

    1 回复  |  直到 15 年前
        1
  •  2
  •   KLE rslite    15 年前

    如果我理解正确,我会说复制数据源是不正确的,它不能工作。

    需要做的是, 在反序列化之后,要获取新的(本地)数据源 这与需要相对应,并在字段中进行设置。这可能已经发生在代码中,请查找 readResolve 方法。

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