Java独立应用程序中静态连接对象的缺点

Java独立应用程序中静态连接对象的缺点,java,mysql,jdbc,Java,Mysql,Jdbc,我对Java还是相当陌生的,当时正在使用GUI构建器学习一些Java的OO和其他编程概念 我创建了一个非常基本的银行系统,客户基本上可以存款和取款 我的代码没有特别的问题,因为一切正常,我只是在数据库连接方面有问题 因为创建连接的代码总是重复的,所以我创建了一个数据库类,如下所示: public class DB { static Connection c; public static void createConnection() throws Exception{

我对Java还是相当陌生的,当时正在使用GUI构建器学习一些Java的OO和其他编程概念

我创建了一个非常基本的银行系统,客户基本上可以存款和取款

我的代码没有特别的问题,因为一切正常,我只是在数据库连接方面有问题

因为创建连接的代码总是重复的,所以我创建了一个数据库类,如下所示:

public class DB {
    static Connection c;

    public static void createConnection() throws Exception{
        Class.forName("com.mysql.jdbc.Driver");
        DB.c = DriverManager.getConnection("jdbc:mysql://localhost:3306/bank", "root", "");
    }

    public static int insertUpdateDelete(String sql) throws Exception{
        if(c == null){
            createConnection();
        }
        return c.createStatement().executeUpdate(sql);
    }

    public static ResultSet search(String sql) throws Exception{
        if(c == null)
            createConnection();
        return c.createStatement().executeQuery(sql);
    }
}
因此,每当我想从数据库中插入/更新/删除时,我都会:

DB.insertUpdateDelete(SQL); //SQL contains the query
对于搜索,我会:

ResultSet rs = DB.search(SQL);
经过一段时间的阅读,我了解到拥有静态连接对象并不是最佳实践,因为“资源泄漏”和查询相互干扰

我的问题是,在一个独立的Java应用程序中获得连接的最佳方式是什么?在这个应用程序中,不必反复重复相同的代码


谢谢

正常的方法是连接池

静态连接对象存在以下问题:

  • 每个用户会话保持一个连接。对于许多用户,这明显增加了DB服务器上的负载(或者许可证成本,如果有的话)
  • 如果连接中断或超时,则无法重新建立连接
每次打开连接都很慢

连接池保持合理数量的打开连接,知道如何替换由于错误而断开的连接,并且可以非常快速地为您提供连接并将其恢复


JDBC有几种连接池的实现。

关于JPA、hibernate等等,还有一些连接池,它们处理创建和维护连接的低级工作:这里还有更多信息:除了连接处理,您目前没有使用参数化查询,如果您需要将任何变量传递给查询(您可能会这样做),这是必须的。这里有一个例子。静态连接可以是一个单用户桌面应用程序,或者一个批处理脚本。从理论上讲,如果我的应用程序只是一个单用户桌面应用程序,那么我发布的代码就没有问题了?返回结果集是错误的做法吗?通常,您希望关闭结果集以释放服务器端资源。@9000谢谢您的帮助。最后一个问题,如果应用程序像你说的那样是单用户桌面应用程序,不关闭连接、语句、结果集会有什么后果吗?不客气!长时间不关闭结果集可能会导致数据库端的资源耗尽,或者应用端的内存耗尽。这需要多长时间,很难说;也许几天,也许几年的连续运行。如果实现足够聪明,能够在结果集完全迭代后自动释放(大部分)资源,那么可能永远不会。我想说,对于一个很少使用的桌面应用来说,这不是什么大不了的事。