2013-06-25 3 views
3

데이터베이스에 사용자 세션 데이터를 저장하려고 시도하고 있습니다. 몇 가지 기사와 이것을 수행하는 방법에 대한 Tomcat 문서를 읽었습니다.Tomcat, JDBCStore를 사용한 사용자 세션 저장소, 즉시 세션 시간 초과

저는 Tomcat7 및 PostgreSQL을 사용 중이며 INSERT가 작동하지만 여전히 문제가 있는지 확인할 수 있습니다. 톰캣은 다음 데이터베이스에 사용자 세션을 삽입되는 것은 즉시 삭제된다

내 톰캣 tomcat7/conf의/context.xml에에서

스 니펫 : 나는 또한 내 tomcat7/conf의이을 추가 한

... 
<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> 
... 

/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 |  | 
+---------------+--------------+------+-----+---------+-------+ 

톰캣 로그 쇼 : 사전에

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]' 

감사 :

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의 쇼를 기록합니다. 당신이 연결되어 있는지 일단 당신은 몇 가지를 확인해야

+0

시도 tomcat7/CONT/logging.properties의 바닥에 'org.apache.catalina.session.level = FINE' 추가. Tomcat을 재시작하면 더 많은 세션 관련 디버그가 catalina.log (및 콘솔)로 이동해야합니다. 그것은 무슨 일이 일어나고 있는지에 대한 단서를 제공 할 수 있습니다. –

+0

@WillKeeling 디버깅 제안에 감사하지만 사실은 이미 추가했지만, 내 게시물에 그것을 언급하는 것을 잊었다. 그것은 정말로 나에게 추가적인 유용한 정보를주지 못했다. 내가 포함 할 게시물을 편집했습니다. – messinga

답변

3

을하는 데 도움이됩니다. 그것은 나를 위해 문제를 해결했습니다 ...

나는 왜 ... 프로그래머가되는 것을 좋아하지 않습니다!

1

...

  1. 그 바람둥이을 확인 실제로 모든

  2. 에서 데이터베이스에 연결되어 .. 않는 사용자가 테이블을 업데이트하기 위해 액세스 할 수 있습니다. tomcat_sessions

  3. 세션에 데이터를 추가하려면 모든 개체를 직렬화해야하거나 다시로드 할 필요가 없습니다.

희망이 내가 MySQL 데이터베이스와 BIGINT 대신 INT (64)를 사용하여 전환

+0

- 1. 그것에 대해 로그 출력으로 다음을 확인하지만, 의도적으로 그것을 잘못된 로그인 정보를주고 차이를 볼 수없는 것은도 연결을 시도하지 않는 제안 할 수 없습니다. JDBC를 사용하여 데이터베이스에 연결하는 독립형 Java 프로그램에 동일한 구성을 사용할 수있었습니다. ** 여기에 디버깅 방법에 대한 제안 사항이 있으시면 훌륭한 내용이 될 것입니다 ** - - 2. 아래 MySQL보기의 특정 사용자는 해당 데이터베이스에 대한 모든 권한을가집니다. - 3. 모두 객체는 직렬화 가능하며 파일 영속 스토리지를 사용하기 전에 다시로드 할 수 있습니다. – messinga

+0

좋아 .. 또 다른 .. 연결이 시도되는 경우 MySQL 서버의 로그 (당신이 말하는 아마로) ... 볼 –

+0

꼬리 모양 당신이 바람둥이 관리자에서 세션 개체에 액세스 할 수 있는지 또한 .. 당신이 표시 될 수 참조 복용 뿐만 아니라 현재의 지속성 ... 그리고 또 다른 필수는 지속적인 관리가 제대로 작동하려면 true로 org.apache.catalina.STRICT_SERVLET_COMPLIANCE 시스템 속성입니다 ... –