【问题标题】:Spring JDBC error connectionSpring JDBC错误连接
【发布时间】:2015-02-19 12:25:28
【问题描述】:

我将 Tomcat 与 Spring 一起使用(使用 Web 服务 Jersey 异步),并且我在 Tomcat 中设置了一个池连接,如下所示:

<Resource auth="Container" driverClassName="com.mysql.jdbc.Driver"
    maxActive="100" maxIdle="50" maxWait="10000" name="jdbc/UsersDB"
    password="secret" type="javax.sql.DataSource"  url="jdbc:mysql://localhost:3306/DB"
    username="root" />

例如,在我的 JDBC 类中,我有:

    public String getMFromToken(String token) {

    logger.info(TAG_LOG + " "
            + "prima della richiesta JDBC id" );

    int id = jdbcTemplateObject.queryForObject(sqlGetToken, new Object [] {token}, Integer.class);

    logger.info(TAG_LOG + " "
            + "recuperato id " + id );

    String sqlGetMFromCred = "select matricola from stud where cred_id = ?";

    logger.info(TAG_LOG + " "
            + "prima della richiesta JDBC matricola" );

    String matricola = jdbcTemplateObject.queryForObject(sqlGetMFromCred, new Object [] {id},String.class);

    logger.info(TAG_LOG + " "
            + "recuperata matricola " + matricola );

    return matricola;
}

如果我长时间不向 tomcat 发出请求(需要查询数据库的请求),tomcat 会响应我 500 错误,但如果我调用任何请求(请求不需要查询数据库)全部有效。

所以问题是 Spring 的一些配置(我认为)..如果我等待很长时间来做任何请求,为什么 Spring 不起作用?

对不起我的英语不好

【问题讨论】:

  • Spring抛出的Tomcat日志中是否有异常?
  • 如果我使用 Eclipse 运行 tomcat,我在哪里可以找到 Tomcat 日志?
  • 尝试在这里寻找它:wiki.apache.org/tomcat/FAQ/Logging#Q6

标签: java spring spring-mvc tomcat jdbc


【解决方案1】:

虽然查看错误消息会有所帮助,但听起来您的 MySQL 服务器正在断开您的池连接。

您说只有让您的应用程序静置一段时间而不向数据库发送任何请求时才会看到此问题。由于您的应用程序没有使用数据库连接,您的 MySQL 服务器将看到连接在一段时间内未使用(如果您控制服务器,这可以配置)并断开它们。

由于服务器断开了它们,连接池还没有意识到它们已经关闭。这会产生一个问题,因为下次您使用连接时,该池会为您的应用程序提供一个错误的连接。虽然我无法确定,因为我没有看到确切的错误消息,但这肯定会导致您收到 500 错误。

我建议您将 testOnBorrowvalidationQuery 属性添加到您的连接池配置中(无论如何,您应该始终设置这些属性)。这将指示池在将它们提供给您的应用程序之前使用您指定的查询测试连接。换句话说,池将过滤掉任何不好的连接,并用新的、好的连接替换它们。

<Resource auth="Container" driverClassName="com.mysql.jdbc.Driver"
    maxActive="100" maxIdle="50" maxWait="10000" name="jdbc/UsersDB"
    password="secret" type="javax.sql.DataSource"  url="jdbc:mysql://localhost:3306/DB"
    username="root" testOnBorrow="true" validationQuery="SELECT 1" />

【讨论】:

  • 我试试你的配置,我会告诉你
猜你喜欢
  • 1970-01-01
  • 2015-06-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-09-26
  • 2014-04-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多