Tomcat JDBC - SQLException不会被池重用的连接

时间:2017-03-23 12:59:55

标签: java sql postgresql tomcat jdbc

我为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连接都会增加。

您知道吗,如何为池中的数据库连接释放哪个以异常结束?

可能这是错误吗?

1 个答案:

答案 0 :(得分:1)

为什么要关闭catch中的连接?您可以/应该使用相同的连接,只需在while循环之外的finally中关闭它。

注意:如果您的查询格式错误,或者您的数据库无法访问,您的代码可以执行无限循环。

我建议你不要在循环时执行此操作,只需重试(例如3次),每次尝试之间等待一段时间。