gpt4 book ai didi

java - tomcat session 复制-未序列化异常

转载 作者:行者123 更新时间:2023-11-30 05:15:47 25 4
gpt4 key购买 nike

我目前正在开发一个困惑的网络应用程序。在此应用程序中,有一个类保存所有数据源。每当需要连接到特定的数据源时,都会调用该类实例中的方法,并带一个参数来选择数据源。类如下

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

并且在每个页面上,这个对象都是获取并设置到 session 中的(我不知道为什么这样)。并且它在当前设置下运行良好。 (集群、负载平衡等)

但是我的工作是实现故障转移,当我启用 session 复制(在内存中 - 简单 TCP)时,写入 session 失败并抛出以下异常

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

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

有没有办法可以更改此类,以便它可以保留在 session 中?

最佳答案

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

需要做的是,反序列化后,获取一个与需求相对应的新的(本地)DataSource,并将其设置在字段中。您的代码中可能已经发生这种情况,请查找 readResolve 方法。

If some parameters are needed to know which DataSource, they can be serialized themselves (because they are no DataSource, they could be just Strings for example).

关于java - tomcat session 复制-未序列化异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1427727/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com