[英]Tomcat - How to persist a session immediately to disk using PersistentManager + FileStore
[英]Session being deleted prematurely from database when using Tomcat and PersistentManager using JDBC Store
将PersistentManager与Tomcat6上的JDBC Store一起使用时,我遇到一个奇怪的问题。 我可以看到该会话正在写入数据库。 我能够将int,boolean,String和Date之类的内容直接放入会话中,但是当我放入自定义java对象时,会话会在几秒钟后从数据库中删除。 自定义对象实现Serializable接口。
文件: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中包含整数或字符串,并且仍会过早删除会话。
我还使用HttpSessionListener和HttpSessionAttributeListener接口实现了侦听器,以查看何时创建会话以及会话属性何时更改。 我从没有看到任何有关会话或会话属性被破坏的消息。
我怀疑它的PersistentManager清理会话。 我检查了时间戳记,并且已删除的会话在我的context.xml文件的maxInactiveInterval中指定的空闲时间未超过10分钟。
任何见解和帮助将不胜感激! 谢谢!
我想我找到了此问题的根本原因。 我查看了MySQL日志,发现有2个与数据库的连接。 连接之一始终发送DELETE语句,该语句删除了相关的会话。 另一个发送了DELETE和INSERT语句,当根据org.apache.catalina.session.JDBCStore的源代码更新会话时,这是正常的。
我意识到,在所有事情开始发生之前,我已经使用相同的配置在本地计算机上编译并意外地部署了该应用程序。 服务器和我的机器上的持久性管理器似乎都在检查数据库中是否有过期的会话。 它无法识别来自服务器的会话,只是将其删除。
基本上,不要在不属于同一群集的不同计算机上运行的同一应用程序上使用PersistentManager。
@Will,谢谢您的建议!
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.