gpt4 book ai didi

java - 使用 JDBC Store 使用 Tomcat 和 PersistentManager 时 session 被过早地从数据库中删除

转载 作者:行者123 更新时间:2023-11-28 22:20:45 25 4
gpt4 key购买 nike

在 Tomcat6 上将 PersistentManager 与 JDBC Store 结合使用时,我遇到了一个奇怪的问题。我可以看到正在写入数据库的 session 。我可以将 int、boolean、String 和 Date 之类的东西直接放入 session 中,但是当我放入自定义 java 对象时, session 会在几秒钟后从数据库中删除。自定义对象实现了 Serializable 接口(interface)。

文件:context.xml

<Manager className="org.apache.catalina.session.PersistentManager"
saveOnRestart="true"
debug="10"
checkInterval="0"
maxActiveSessions="-1"
minIdleSwap="-1"
maxIdleSwap="0"
maxIdleBackup="0"
maxInactiveInterval="600">
<Store className="org.apache.catalina.session.JDBCStore"
connectionURL="[CONNECTION URL]"
driverName="com.mysql.jdbc.Driver"
sessionAppCol="app_name"
sessionDataCol="session_data"
sessionIdCol="session_id"
sessionLastAccessedCol="last_access"
sessionMaxInactiveCol="max_inactive"
sessionTable="sessions"
sessionValidCol="valid_session"
checkInterval="0"
debug="99" />
</Manager>
<Valve className="org.apache.catalina.valves.PersistentValve" />

文件:TestObj.java

import java.io.Serializable;

public class TestObj implements Serializable {

private static final long serialVersionUID = 1L;

private String test;
private Integer testObjId;

public String getTest() {
return test;
}
public void setTest(String test) {
this.test = test;
}

public Integer getTestObjId() {
return testObjId;
}
public void setTestObjId(Integer testObjId) {
this.testObjId = testObjId;
}

@Override
public String toString() {
StringBuffer str = new StringBuffer();
str.append("[");
str.append("test : ").append(test);
str.append(", testObjId : ").append(testObjId);
str.append("]");
return str.toString();
}



public TestObj() {
this.test = "";
this.testObjId = 0;
}

}

注意:我曾尝试在 TestObj 中只包含整数或字符串,但 session 仍会过早删除。

我还使用 HttpSessionListener 和 HttpSessionAttributeListener 接口(interface)实现了监听器,以查看何时创建 session 以及何时更改 session 属性。我从来没有看到 session 或 session 属性被破坏的消息。

我怀疑是 PersistentManager 清理了 session 。我检查了时间戳,删除的 session 没有空闲超过 10 分钟,如我的 context.xml 文件中的 maxInactiveInterval 中所指定的那样。

任何见解和帮助将不胜感激!谢谢!

最佳答案

我想我找到了这个问题的根本原因。我查看了 MySQL 日志,发现有 2 个到数据库的连接。其中一个连接总是发送删除相关 session 的 DELETE 语句。另一个发送了 DELETE 和 INSERT 语句,这在根据 source code 更新 session 时是正常的。对于 org.apache.catalina.session.JDBCStore。

我意识到,在这一切开始之前,我在本地计算机上编译并意外部署了具有相同配置的应用程序。服务器和我机器上的持久性管理器似乎都在检查数据库中是否存在过期 session 。它无法识别来自服务器的 session ,只是将其删除。

基本上,不要在不属于同一集群的不同机器上运行的同一应用程序上使用 PersistentManager。

@Will,谢谢你的建议!

关于java - 使用 JDBC Store 使用 Tomcat 和 PersistentManager 时 session 被过早地从数据库中删除,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21238245/

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