Java 当使用Tomcat和PersistentManager使用JDBC存储时,会话被过早地从数据库中删除
在Tomcat6上使用PersistentManager和JDBC存储时,我遇到了一个奇怪的问题。我可以看到会话正在写入数据库。我可以将int、boolean、String和Date等内容直接放入会话中,但是当我放入一个自定义java对象时,会话会在几秒钟后从数据库中删除。自定义对象实现可序列化接口 文件:context.xmlJava 当使用Tomcat和PersistentManager使用JDBC存储时,会话被过早地从数据库中删除,java,session,tomcat,serialization,jdbc,Java,Session,Tomcat,Serialization,Jdbc,在Tomcat6上使用PersistentManager和JDBC存储时,我遇到了一个奇怪的问题。我可以看到会话正在写入数据库。我可以将int、boolean、String和Date等内容直接放入会话中,但是当我放入一个自定义java对象时,会话会在几秒钟后从数据库中删除。自定义对象实现可序列化接口 文件:context.xml <Manager className="org.apache.catalina.session.PersistentManager" saveOn
<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中包含整数或字符串,会话仍然被提前删除
我还使用HttpSessionListener和HttpSessionAttributeListener接口实现了侦听器,以查看会话何时创建以及会话属性何时更改。我从未看到会话或会话属性被破坏的消息
我怀疑是PersistentManager在清理会话。我检查了时间戳,删除的会话空闲时间未超过10分钟,如我的context.xml文件中maxInactiveInterval中所指定的
任何见解和帮助都将不胜感激!谢谢 我想我找到了这个问题的根本原因。我查看了MySQL日志,发现有两个数据库连接。其中一个连接始终发送删除相关会话的DELETE语句。另一个发送了DELETE和INSERT语句,这在根据for org.apache.catalina.session.JDBCStore更新会话时是正常的 我意识到,在这一切发生之前,我用相同的配置在本地机器上编译并意外地部署了应用程序。服务器和我的机器上的持久性管理器似乎都在检查数据库中是否有过期的会话。它无法识别服务器上的会话,只是将它们删除了 基本上,不要在不属于同一集群的不同计算机上运行的同一应用程序上使用PersistentManager
@威尔,谢谢你的建议 您是否尝试过打开
org.apache.catalina.session.JDBCStore
的日志记录,并观看catalina.out
以获取任何见解?您可以在TOMCAT_HOME/conf/logging中增加日志级别。properties
@将感谢您的建议。我做了一些日志记录,但我在logging.properties文件中添加了org.apache.catalina.session.level=ALL
和org.apache.catalina.session.JDBCStore.level=ALL
,我看到了下面类似的消息,但没有关于删除会话的任何信息org.apache.catalina.session.PersistentManagerBase swapIn
org.apache.catalina.session.JDBCStore load
org.apache.catalina.session.StandardSession readObject我从上面截取了如下消息“精细:将会话FB2EDA36893345044F7C43550B0C18B保存到数据库会话“这很奇怪,因为我本以为会在那里看到一条删除消息。也许您还可以在启动MySQL-mysqld--log=log\u file\u name
时启用MySQL自己的日志记录。这应该会显示正在删除会话的语句-我假设是delete语句,但日志肯定会确认。@我会打开MySQL中的日志记录并看到delete语句吗。通过查看会话和PersistentManager的代码库,我发现如果需要在数据库中更新会话,它将删除并插入更新的会话信息。他们在代码中有一个“TODO”注释,将其更改为仅使用UPDATE。我确实看到了单独的DELETE语句,所以我猜PersistentManager中有什么东西要求删除它,而不是更新它。我仍在追查这一切,但我可能会有所发现。
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;
}
}