我为PostgreSQL使用Tomcat JDBC连接池。
游泳池配置
<Resource name="jdbc/pg_mega" auth="Container"
type="javax.sql.DataSource" driverClassName="org.postgresql.Driver"
url="jdbc:postgresql://127.0.0.1:6432/db"
factory="org.apache.tomcat.jdbc.pool.DataSourceFactory"
username="***" password="****"
defaultAutoCommit="true"
initialSize="1"
maxActive="300"
maxTotal="300"
maxIdle="20"
minIdle="5"
maxWait="10000"
validationQuery="select 1"
validationInterval="30000"
testWhileIdle="false"
testOnBorrow="true"
testOnReturn="false"
timeBetweenEvictionRunsMillis="30000"
minEvictableIdleTimeMillis="30000"
/>
Java代码的一部分
Connection c = null;
Statement s = null;
ResultSet rs = null;
DataSource ds = ... Get DataSource ...
while(running) {
if (c == null) {
try {
c = ds.getConnection();
} catch (SQLException exi) { env.l.pe(exi); }
}
try {
s = c.createStatement();
rs = s.executeQuery(q);
} catch (SQLException sec) {
// close resources
if (rs != null) {
try { rs.close(); } catch (SQLException sec2) { env.l.pe(sec2); }
rs = null;
}
if (s != null) {
try { s.close(); } catch (SQLException sec2) { env.l.pe(sec2); }
s = null;
}
if (c != null) {
try { c.close(); } catch (SQLException sec2) { env.l.pe(sec2); }
c = null;
}
continue;
}
finally {
... close connection, statement, resultset...
}
}
如果在s.executeQuery(q)
期间发生异常,我将关闭Connection,Statement,ResultSet并再次尝试连接(循环继续之后)。
正如我在JDBC池活动中看到的,每次发生异常时Active连接都会增加。
您知道吗,如何为池中的数据库连接释放哪个以异常结束?
可能这是错误吗?
答案 0 :(得分:1)
为什么要关闭catch中的连接?您可以/应该使用相同的连接,只需在while循环之外的finally中关闭它。
注意:如果您的查询格式错误,或者您的数据库无法访问,您的代码可以执行无限循环。
我建议你不要在循环时执行此操作,只需重试(例如3次),每次尝试之间等待一段时间。