4

我正在尝试将用户会话数据存储在数据库中。我已经关注了几篇文章和关于如何做到这一点的 Tomcat 文档。

我现在正在使用 Tomcat7 和 PostgreSQL,并且可以确认 INSERTS 正在工作,但仍然存在问题。Tomcat 将用户会话插入数据库,然后立即将其删除:

来自我的 Tomcat tomcat7/conf/context.xml 的片段:

...
<Manager className="org.apache.catalina.session.PersistentManager"           
        maxIdleBackup="1"
        minIdleSwap="0"
        maxIdleSwap="0"
        processExpiresFrequency="1"
        saveOnRestart='true'
        >

        <Store className="org.apache.catalina.session.JDBCStore"                
                connectionURL="jdbc:postgresql://localhost:5432/tomcat?user=[USER]&amp;password=[PASSWORD]"
                driverName="org.postgresql.Driver"
                sessionAppCol="app_name"
                sessionDataCol="session_data"
                sessionIdCol="session_id"
                sessionLastAccessedCol="last_access"
                sessionMaxInactiveCol="max_inactive"
                sessionTable="tomcat_sessions"
                sessionValidCol="valid_session" 
                />
</Manager>
...

我也将此添加到我的 tomcat7/conf/catalina.properties 中:

...
org.apache.catalina.session.StandardSession.ACTIVITY_CHECK=true
org.apache.catalina.STRICT_SERVLET_COMPLIANCE=true
...

我在 tomcat7/lib 中有 PostgreSQL JDBC 连接器。

我尝试过的变体:

  • 雄猫 6
  • 雄猫 7
  • MySQL
  • PostgreSQL

我还在 conf/logging.properties 中添加了以下内容,希望可以进一步调试:

...
org.apache.catalina.session.PersistentManager.level = ALL
org.apache.catalina.session.PersistentManager.useParentHandlers = true
org.apache.catalina.session.level = ALL
org.apache.catalina.session.useParentHandlers = true
...

表架构是

+---------------+--------------+------+-----+---------+-------+
| Field         | Type         | Null | Key | Default | Extra |
+---------------+--------------+------+-----+---------+-------+
| session_id    | varchar(100) | NO   | PRI | NULL    |       |
| valid_session | char(1)      | NO   |     | NULL    |       |
| max_inactive  | int(32)      | NO   |     | NULL    |       |
| last_access   | int(64)      | NO   |     | NULL    |       |
| app_name      | varchar(255) | YES  | MUL | NULL    |       |
| session_data  | mediumblob   | YES  |     | NULL    |       |
+---------------+--------------+------+-----+---------+-------+

Tomcat日志显示:

Jun 27, 2013 2:16:33 PM org.apache.catalina.session.PersistentManagerBase processExpires
FINE: Start expire sessions PersistentManager at 1372338993228 sessioncount 1
Jun 27, 2013 2:16:33 PM org.apache.catalina.session.PersistentManagerBase processMaxIdleSwaps
FINE: Swapping session 22115A5964B70168B1752D5415DAD31C to Store, idle for 36 seconds
Jun 27, 2013 2:16:33 PM org.apache.catalina.session.PersistentManagerBase processExpires
FINE: End expire sessions PersistentManager processingTime 168 expired sessions: 0

postgreSQL 日志显示:

2013-06-27 14:16:33 IST LOG:  execute <unnamed>: INSERT INTO tomcat_sessions (session_id, app_name, session_data, valid_session, max_inactive, last_access) VALUES ($1, $2, $3, $4, $5, $6)
2013-06-27 14:16:33 IST DETAIL:  parameters: $1 = '22115A5964B70168B1752D5415DAD31C', $2 = '/Catalina/localhost/[SERVLET_NAME]', $3 = '\xaced...f72', $4 = '1', $5 = '1800', $6 = '1372338956718'
2013-06-27 14:16:33 IST LOG:  execute <unnamed>: SELECT session_id FROM tomcat_sessions WHERE app_name = $1
2013-06-27 14:16:33 IST DETAIL:  parameters: $1 = '/Catalina/localhost/[SERVLET_NAME]'
2013-06-27 14:16:33 IST LOG:  execute <unnamed>: SELECT session_id, session_data FROM tomcat_sessions WHERE session_id = $1 AND app_name = $2
2013-06-27 14:16:33 IST DETAIL:  parameters: $1 = '22115A5964B70168B1752D5415DAD31C', $2 = '/Catalina/localhost/[SERVLET_NAME]'
2013-06-27 14:16:33 IST LOG:  execute <unnamed>: DELETE FROM tomcat_sessions WHERE session_id = $1  AND app_name = $2
2013-06-27 14:16:33 IST DETAIL:  parameters: $1 = '22115A5964B70168B1752D5415DAD31C', $2 = '/Catalina/localhost/[SERVLET_NAME]'

提前致谢。

4

3 回答 3

6

我切换到 MySQL 数据库并使用 BIGINT 而不是 INT(64)。它为我解决了这个问题......

我不知道为什么......喜欢成为一名程序员!

于 2013-06-28T14:49:58.987 回答
2

Tomcat 7.0.x 中有一个错误。您需要升级到 7.0.56+ 或 8。

https://issues.apache.org/bugzilla/show_bug.cgi?id=57016

于 2014-12-09T21:37:09.720 回答
1

你需要检查几件事...

  1. 验证 tomcat 是否真正连接到数据库

  2. 然后,一旦您确定它正在连接.. 用户是否有权更新表 tomcat_sessions

  3. 如果要向会话添加数据,则所有对象都需要可序列化,否则它们将无法重新加载

希望这可以帮助

于 2013-06-26T16:33:29.253 回答