我一直在尝试Tomcat的本地conncetion池功能,以避免我的Java Web项目中的连接超时,但似乎我仍然运气不好。
我已将mysql-connector-java-5.1.23-bin.jar
放入WEB-INF/lib
文件夹,创建了META-INF/context.xml
,如下所示:
<?xml version="1.0" encoding="UTF-8"?>
<Context>
<Resource name="jdbc/TheDatabase" auth="Container"
type="javax.sql.DataSource" driverClassName="com.mysql.jdbc.Driver"
maxActive="100" maxIdle="30" maxWait="1000"
poolPreparedStatements="true" maxOpenPreparedStatements="100"
username="user" password="pass"
url="jdbc:mysql://localhost:3306/my_database"/>
</Context>
这就是我的所作所为:
public static init() {
...
sqlDataSource = (DataSource) new InitialContext().lookup("java:comp/env/jdbc/TheDatabase");
...
}
public static ArrayList<ResultSet> dbRead() {
Connection conn = sqlDataSource.getConnection();
Statement stmt = null;
try {
stmt = conn.createStatement();
ResultSet res = stmt.executeQuery("SELECT * FROM the_table");
...
res.close();
return out;
} catch (SQLException e) {
// Logging stuff
return null;
} finally {
if (stmt != null)
try {if (!stmt.isClosed()) stmt.close();}
catch (SQLException e) {/* Logging stuff */}
if (conn != null)
try {if (!conn.isClosed()) conn.close();}
catch (SQLException e) {/* Logging stuff */}
}
}
每当我在dbRead
过去后调用函数wait_timeout
时,我得到:
Communications link failure
The last packet successfully received from the server was 1.818.697 milliseconds
ago. The last packet sent successfully to the server was 0 milliseconds ago.
具有SQL状态08S01
。
我认为这是因为一些不正确的关闭,但似乎并非如此。
答案 0 :(得分:1)
尝试添加验证查询,现在让我。我希望这可以解决问题 如果没有,那么将本地主机更改为您机器的IP (您也可以测试127.0.0.1)
<?xml version="1.0" encoding="UTF-8"?>
<Context>
<Resource name="jdbc/TheDatabase" auth="Container"
type="javax.sql.DataSource" driverClassName="com.mysql.jdbc.Driver"
maxActive="100" maxIdle="30" maxWait="1000"
poolPreparedStatements="true" maxOpenPreparedStatements="100"
username="user" password="pass" validationQuery="select now()"
url="jdbc:mysql://192.168.1.1:3306/my_database"/>
</Context>
答案 1 :(得分:0)
将autoReconnect设置为true,默认值为false。 更多信息或帮助
autoReconnect 驱动程序是否应该尝试重新建立陈旧和/或死连接?如果启用,驱动程序将为在旧连接或死连接上发出的查询抛出异常,这些查询属于当前事务,但会在新事务中在连接上发出下一个查询之前尝试重新连接。建议不要使用此功能,因为当应用程序无法正确处理SQLExceptions时,它会产生与会话状态和数据一致性相关的副作用,并且仅在您无法配置应用程序以处理由此产生的SQLExceptions时使用。死和陈旧的连接正常。或者,作为最后一个选项,研究将MySQL服务器变量“wait_timeout”设置为高值,而不是默认值为8小时。假1.1
autoReconnectForPools 使用适用于连接池的重新连接策略(默认为'false')false 3.1.3
答案 2 :(得分:0)
尝试使用这个东西:
<Resource name="jdbc/myDataSource" auth="Container" type="javax.sql.DataSource"
maxActive="100" maxIdle="30" maxWait="10000"
username="user" password="pass"
driverClassName="com.mysql.jdbc.Driver"
url="jdbc:mysql://localhost/my_database?autoReconnect=true"
logAbandoned="true" removeAbandoned="true"
removeAbandonedTimeout="60" />
答案 3 :(得分:0)
似乎我需要添加到<Resource>
定义的所有内容都是validationQuery
属性。没有autoReconnect
,没有autoReconnectForPools
,没有。这只是有效:
<Resource name="jdbc/TheDatabase" auth="Container"
type="javax.sql.DataSource" driverClassName="com.mysql.jdbc.Driver"
maxActive="100" maxIdle="30" maxWait="1000"
poolPreparedStatements="true" maxOpenPreparedStatements="100"
username="user" password="pass" validationQuery="SELECT 1"
url="jdbc:mysql://localhost:3306/my_database"/>
该属性甚至不在MySQL documentation,所以我不知道它的存在。现在我怀疑其他一些属性是否也有任何影响...