【问题标题】:Strange jdbcReam Exception occurs on TomcatTomcat 上出现奇怪的 jdbcReam 异常
【发布时间】:2014-08-23 10:21:06
【问题描述】:

我有一个简单的 java one-servlet web 应用程序,在我的本地主机上受 BASIC 身份验证限制。如果我使用默认的 UserDatabaseRealm,它可以正常工作。

我尝试使用 jdbcReaml - projectName/META-INF/context.xml:

 <?xml version="1.0" encoding="UTF-8"?>
 <Context antiJARLocking="true" path="/projectName">
      <Realm  className="org.apache.catalina.realm.JDBCRealm"
              driverName="org.postgresql.Driver"
              connectionURL="jdbc:postgresql://localhost/realm"
              connectionName="****" connectionPassword="****"
              userTable="users" userNameCol="user_name" userCredCol="user_pass"
              userRoleTable="roles" roleNameCol="user_role" />
 </Context>

我的数据库充满了用户和他们的密码,我也为用户创建了角色。 身份验证正常,但每次客户端填写他的身份验证数据时都会发生异常:

02-Jul-2014 14:42:37.406 SEVERE [http-nio-8080-exec-11] org.apache.catalina.realm.JDBCRealm.getPassword Exception performing authentication
org.postgresql.util.PSQLException: This statement has been closed.
at org.postgresql.jdbc2.AbstractJdbc2Statement.checkClosed(AbstractJdbc2Statement.java:2631)
at org.postgresql.jdbc2.AbstractJdbc2Statement.setString(AbstractJdbc2Statement.java:1373)
at org.apache.catalina.realm.JDBCRealm.credentials(JDBCRealm.java:484)
at org.apache.catalina.realm.JDBCRealm.getPassword(JDBCRealm.java:525)
at org.apache.catalina.realm.JDBCRealm.authenticate(JDBCRealm.java:387)
at org.apache.catalina.realm.JDBCRealm.authenticate(JDBCRealm.java:334)
at org.apache.catalina.authenticator.BasicAuthenticator.authenticate(BasicAuthenticator.java:111)
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:578)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:136)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:78)
at org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:610)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:88)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:526)
at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1033)
at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:652)
at org.apache.coyote.http11.Http11NioProtocol$Http11ConnectionHandler.process(Http11NioProtocol.java:222)
at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1566)
at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.run(NioEndpoint.java:1523)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
at java.lang.Thread.run(Thread.java:745)

我花了很多时间试图解决这个问题。

据我所知,我认为该问题出现在 PostgresQL 连接期间。我的代码对数据库连接没有任何作用。 我该如何解决这个问题?

我不想将 DataSourceRealm 与连接池一起使用,我只想解决我的问题并继续使用 tomcat。

任何帮助表示赞赏。

【问题讨论】:

  • 我遇到了同样的问题,从带有 Java-6 的 Tomcat-6 到带有 Java-7 的 Tomcat-8。你的 Tomact/java 版本是什么?
  • 看来是Tomcat-8惹的祸?我对 Tomcat-7 没有问题(其他一切都完全相同)
  • 问题出现在 Tomcat 8 和 Java 7 上。仍然没有解决这个问题。我改用 DataSourceRealm(它使用池)。学习使用 JdbcRealm 的目的很有趣。

标签: java postgresql tomcat jdbc jdbcrealm


【解决方案1】:

这个问题是由 2014 年 3 月进行的重构造成的。它最近已修复,应该在 tomcat 8.0.19 中。

【讨论】:

  • 你能链接到关于这个的 GitHub/JIRA 问题吗?谢谢
  • 它没有遇到 Bugzilla 问题,但可以在 in rev 1657683 找到修复程序,并在更改说明中表示为“修复 JDBCRealm 中的身份验证时异常。”适用于 Apache Tomcat 8.0.19 并随版本 8.0.20 一起发布。
【解决方案2】:

这一定是连接的一端由于超时而关闭的问题。这可能是 postgres 服务器关闭连接或 tomcat 关闭连接。我建议将领域配置为使用在 tomcat 中配置的 jndi 数据源,这将允许您配置连接的超时。您可能必须使用数据源的配置。

数据源配置

<Resource
    name="jdbc/authority"
    type="javax.sql.DataSource"
    auth="Container"
    driverClassName="org.postgresql.Driver"
    maxActive="100"
    maxWait="10000"
    maxIdle="30"
    password="password"
    logAbandoned="true"
    username="username"
    removeAbandoned="true"
    removeAbandonedTimeout="60"
    url="jdbc:postgres://localhost:3306/realm"
/>

领域配置

<Realm className="org.apache.catalina.realm.DataSourceRealm"
   dataSourceName="jdbc/authority"
   userTable="users" 
   userNameCol="user_name" 
   userCredCol="user_pass"
   userRoleTable="user_roles" 
   roleNameCol="role_name"
/>

顺便说一句,您可以在此处查看数据源领域 http://tomcat.apache.org/tomcat-8.0-doc/realm-howto.html

【讨论】:

  • 奇怪的是 Tomcat-8 会发生这种情况,而不是 6 或 7
  • 不知道为什么它可能会随着 tomcat 管理 dbConnections 的方式而在内部发生变化。我查看了 tomcat 源,但问题必须是传递给凭据方法的 dbConnection 已关闭。 grepcode.com/file/repo1.maven.org/maven2/org.apache.tomcat/…
  • 感谢您的详细回复。那是很久以前的事了,但据我所知,在重新部署应用程序而不重新启动 tomcat 后出现 JdbcReaml 异常(我可能是错的)。可能与tomcat自然内存泄漏有关?
猜你喜欢
  • 2013-08-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多