【问题标题】:JDBC Connection.isValid() for single threaded permanent connection?用于单线程永久连接的 JDBC Connection.isValid()?
【发布时间】:2015-03-22 13:07:26
【问题描述】:

我正在编写一个应用程序,其中一个线程将使用 JDBC 与 MySQL 数据库建立永久连接,而其他线程将永远不会使用此连接。

我的想法是这样的:

import java.sql.Connection;

public class ConHolder {

    private Connection con;

    public Connection getConnection(int checkTimeout) {
        if(!con.isValid(checkTimeout)) {
            con.close();
            con = createNewConnection();
        }
        return con;
    }

    private Connection createNewConnection() {
        return /* a newly created connection */;
    }

}

这样好吗?还是需要一个实际的连接池?

【问题讨论】:

    标签: java mysql sql jdbc connection-pooling


    【解决方案1】:

    我觉得差不多吧。唯一可能的问题是:

    • isValid 在 Java 6 之前不可用,并且

    • 仍然存在潜在的故障模式,即调用 isValid 的应用程序和尝试使用该连接执行重要操作之间的连接变坏1


    1 - 请注意,您可以获得与典型连接池相同的故障模式。唯一真正的解决方案是通过重新启动事务来处理因连接断开而导致 SQLException 的情况。

    【讨论】:

    • @MinecraftShamrock 'Race condition' 是在这里使用的错误术语。这是一个时间窗口问题。最好使用连接池。
    • @EJP 你的意思是使用连接池维护多个连接更有效,因为 isValid() 并且创建新连接需要太长时间?
    • @MinecraftShamrock - 我怀疑这就是他的意思
    • @EJP 或 StephenC 能否解释一下您所说的“时间窗口问题”是什么意思,并请举例说明第二点?
    • @MinecraftShamrock - ermm ...问题应该是不言而喻的。 1) 应用程序验证连接。验证成功。 2)然后...数据库重新启动 3)然后应用程序尝试使用不再有效的连接...砰!
    猜你喜欢
    • 2011-08-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-10
    • 1970-01-01
    • 1970-01-01
    • 2011-07-28
    相关资源
    最近更新 更多