Java JDBC 效率 : How long should a connection be maintained?

标签 java performance jdbc connection

我仍在处理同样的问题提及 here .它似乎工作正常,尤其是在创建如下所示的 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;
        }
    }

}

我已经在上述问题的链接中发布了存储过程和单例模式实现。

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

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

如果我的假设是正确的(使用一个连接实例更有效),那么应该在 Controller 中处理连接的打开和关闭,这就是我创建 createConnection() 和 closeConnection() 方法的原因。

谢谢。

最佳答案

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

因此,您应该始终清理自己。无论你做什么。打开连接,做你的事情(一个或 SQL 语句)并关闭连接。 永远!

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

我曾看到应用程序服务器由于 Web 应用程序未关闭连接而导致连接中断。或者因为他们在注销时关闭并且有人说“我们永远不会同时拥有那么多用户”,但它只是扩展了一点到高。

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

然后您甚至可以为整个 session 模型设置一个连接,DBCP 也支持它 - 这没有危险,因为您可以在需要时重新配置连接池,而无需触及您的客户端代码。

关于Java JDBC 效率 : How long should a connection be maintained?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11202046/

相关文章:

java - 如何跳过责任链中的空值?

sql-server - ASP.NET WebAPI 和 IIS 中的请求计时不一致

java - 如何使用 JDBC 在 Oracle 中插入很长的时间(以毫秒为单位)

java - 偏向锁定设计决策

java - 无需使用 Firebase Phone Auth 登录即可进行移动 OTP 验证

javascript - Java 和 JavaScript 如何协同工作?

android - 关闭 Dalvik VM 的所有优化

python - itertools.islice 与列表切片相比

java - 如何将数据持久保存到 postgres,而无需转换特定的数据类型

java - HikariCP 通过 Oracle 自定义类型