![](/img/trans.png)
[英]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.