Spring JDBC 错误连接
Spring JDBC error connection
我将 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 class 中我有:
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 不起作用?
抱歉我的英语不好
虽然查看错误消息会有所帮助,但听起来您的 MySQL 服务器正在断开您的共用连接。
您说过,只有当您让应用静置一段时间而不向数据库发送任何请求时,您才会看到此问题。当您的应用程序未使用数据库连接时,您的 MySQL 服务器将看到连接在一段时间内未被使用(如果您控制服务器,这是可配置的)并断开连接。
因为服务器断开了它们,连接池还没有意识到它们已经关闭。这会产生一个问题,因为下次您使用连接时,池会为您的应用程序提供一个错误的连接。虽然我不能确定,因为我没有看到确切的错误消息,但这肯定会导致您收到 500 错误。
我建议您将 testOnBorrow 和 validationQuery 属性添加到您的连接池配置中(您应该始终拥有这些无论如何设置)。这将指示池在将它们提供给您的应用程序之前使用您指定的查询测试连接。换句话说,连接池将过滤掉所有不良连接,并用新的良好连接替换它们。
<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" />
我将 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 class 中我有:
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 不起作用?
抱歉我的英语不好
虽然查看错误消息会有所帮助,但听起来您的 MySQL 服务器正在断开您的共用连接。
您说过,只有当您让应用静置一段时间而不向数据库发送任何请求时,您才会看到此问题。当您的应用程序未使用数据库连接时,您的 MySQL 服务器将看到连接在一段时间内未被使用(如果您控制服务器,这是可配置的)并断开连接。
因为服务器断开了它们,连接池还没有意识到它们已经关闭。这会产生一个问题,因为下次您使用连接时,池会为您的应用程序提供一个错误的连接。虽然我不能确定,因为我没有看到确切的错误消息,但这肯定会导致您收到 500 错误。
我建议您将 testOnBorrow 和 validationQuery 属性添加到您的连接池配置中(您应该始终拥有这些无论如何设置)。这将指示池在将它们提供给您的应用程序之前使用您指定的查询测试连接。换句话说,连接池将过滤掉所有不良连接,并用新的良好连接替换它们。
<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" />