Java JDBC效率:连接应维持多长时间?

gre*_*alu 5 java connection performance jdbc

我仍在处理此处提到的相同问题。似乎工作正常,尤其是在创建如下所示的AbstractModel类之后:

public abstract class AbstractModel {

    protected static Connection myConnection = SingletonConnection.instance().establishConnection();
    protected static Statement stmt;
    protected static ResultSet rs;

    protected boolean loginCheck;                   // if userId and userLoginHistoryId are valid - true, else false
    protected boolean userLoggedIn;                 // if user is already logged in - true, else false

    public AbstractModel (int userId, Long userLoginHistoryId){
        createConnection();                                 // establish connection
            loginCheck = false;
        userLoggedIn = false;
        if (userId == 0 && userLoginHistoryId == 0){        // special case for login
            loginCheck = true;                              // 0, 0, false, false
            userLoggedIn = false;                           // set loginCheck to true, userLogged in to false
        } else {
            userLoggedIn = true;
            try{
                String query = "select \"user_login_session_check\"(" + userId + ", " + userLoginHistoryId + ");";
                System.out.println("query: " + query);
                stmt = myConnection.createStatement();
                rs = stmt.executeQuery(query);
                while (rs.next()){
                    loginCheck = rs.getBoolean(1);
                }
            } catch (SQLException e){
                System.out.println("SQL Exception: ");
                e.printStackTrace();
            }
        }

    }
    // close connection
    public void closeConnection(){
        try{
            myConnection.close();
        } catch (SQLException e){
            System.out.println("SQL Exception: ");
            e.printStackTrace();
        }

    }
    // establish connection
    public void createConnection(){
        myConnection = SingletonConnection.instance().establishConnection();
    }

    // login session check
    public boolean expiredLoginCheck (){
        if (loginCheck == false && userLoggedIn == true){
            closeConnection();
            return false;
        } else {
            return true;
        }
    }

}
Run Code Online (Sandbox Code Playgroud)

我已经在上面前面的问题的链接中发布了存储过程和Singleton Pattern实现。

我的印象是,在每次数据事务之后,我都不需要关闭与数据库的连接,因为这只会降低应用程序的速度。我正在为这个系统构建大约30个用户,因此性能和可用性很重要。

延长至少3-4个数据事务的连接是否正确?例如。对用户输入进行某种形式的验证检查,或类似于google的自动建议...这些都是基于用户输入的独立存储函数调用。我可以使用一个连接实例,而不是在每次数据事务之后都进行连接和断开连接吗?哪个更有效?

如果我的假设是正确的(使用一个连接实例更有效),则应在控制器中处理打开和关闭连接的过程,这就是为什么我创建了createConnection()和closeConnection()方法的原因。

谢谢。

Tom*_*zak 5

您的代码永远不应依赖于以下事实:您的应用程序当前是数据库的唯一客户端,或者您只有30个用户。因此,您应该处理数据库连接,例如文件,套接字以及可能会运行的所有其他稀有资源。

因此,您应该始终自己清理一下。无论你做什么。打开连接,执行您的任务(一个或SQL语句)并关闭连接。总是!

在您的代码中,创建连接并将其保存到静态变量中-该连接将一直持续到AbstractModel类存在(可能永远存在),这很糟糕。与所有类似的情况一样,将代码放在try / finally中以确保连接始终关闭。

由于Web应用程序未关闭连接,我已经看到应用程序服务器正在运行连接。或者因为他们在注销时关闭,并且有人说“我们永远不会拥有那么多的用户”,但是它只是稍微扩大了一点。

现在,当您运行代码并正确关闭连接时,就像zaske所说的那样,添加连接池。这将解决打开/关闭数据库连接的性能问题,这确实是昂贵的。在您不希望知道何时打开/关闭物理连接的逻辑层(您的应用程序)上,数据库层(数据库池)将为您处理它。

然后,您甚至可以为整个会话模型建立一个连接,DBCP也支持该连接-这是没有危险的,因为如果需要,您可以在以后重新配置池,而无需修改客户端代码。


Yai*_*sky 0

你是对的,你不需要在每次调用后关闭连接。
请记住,现代数据库实现了内部连接池,但您的应用程序仍然需要连接和检索连接对象,这就是它现在所做的。
您应该考虑使用数据库连接池 - 有各种 Java 框架可以为您提供这样的解决方案,并且它们将定义(当然您可以配置)数据库连接池何时关闭。

一般来说 - 您应该问自己您的数据库是否只为您的应用程序提供服务,还是也为其他应用程序提供服务 - 如果它不为其他应用程序提供服务,您可能可以更加“贪婪”并保持连接打开更长的时间。
我还建议您的应用程序在启动时创建固定数量的连接(在您的配置中将其定义为“最小连接数”),并且如果需要,您可以让它增长到最大连接数。

正如我之前提到的 - 这些想法已经被各种框架实现,例如 - Apache 的DBCP项目。