Java 这个打开/关闭JDBC连接代码正常吗?

Java 这个打开/关闭JDBC连接代码正常吗?,java,mysql,jdbc,connection,Java,Mysql,Jdbc,Connection,我不确定这个代码是否正确。我从我的Java课程的一个例子中了解到了这一点,但我发现事实上它从未关闭连接,而且异常看起来也没有被正确捕获。(我从我的业务层调用查询方法) 我应该在每个查询方法中打开和关闭连接并删除“static{}”表达式吗? 这样地?(仍不确定例外情况): 谢谢您的回答。静态块只执行一次,因此您可以打开一个连接,然后在程序期间保持它打开 这确实有效,但由于一些原因存在缺陷。例如,一旦开始多线程,它就完全没有用了 您的第二个示例更好,但仍有缺陷,最好的方法是: 使用连接池保持连接打

我不确定这个代码是否正确。我从我的Java课程的一个例子中了解到了这一点,但我发现事实上它从未关闭连接,而且异常看起来也没有被正确捕获。(我从我的业务层调用查询方法)

我应该在每个查询方法中打开和关闭连接并删除“static{}”表达式吗? 这样地?(仍不确定例外情况):


谢谢您的回答。

静态块只执行一次,因此您可以打开一个连接,然后在程序期间保持它打开

这确实有效,但由于一些原因存在缺陷。例如,一旦开始多线程,它就完全没有用了

您的第二个示例更好,但仍有缺陷,最好的方法是:

  • 使用连接池保持连接打开,需要时从池中请求连接

  • 使用try finally块确保始终关闭连接和/或在连接完成后将其返回池


  • 您不需要创建JDBC驱动程序类的新实例

    1) 将其更改为Class.forName(JDBC\U驱动程序)。将newInstance()更改为Class.forName(JDBC\U驱动程序)

    您只需要向JVM注册该类(这涉及静态变量和块的初始化)

    2) 尝试按照上面的建议创建连接线程池

    3) 使用
    try with resources
    块连接、语句和结果集,因为所有三个接口都扩展了
    java.lang.AutoCloseable
    。因此,您的资源总是关闭的,而不必编写锅炉板代码。此外,关闭finally块中的资源时,业务逻辑中的异常不会被发生的任何异常所掩盖


    但是你当然知道JDK7的功能。这些都是作为硬币计划的一部分实现的。只要用谷歌搜索一下,你就会得到更多的信息。

    为什么一切都是静态的?有一个语法错误-您在其中写入
    stringdata=。在对可能为空的变量调用
    close()
    时还有其他问题。我想为了可读性起见,这一切都简化了。毕竟,这是一门课程。大多数人会选择某种连接池。@DavidWallace,我错过了字符串的东西(编辑)。关于close()我应该编写如下代码:
    if(con!=null){con.close()}
    关于如何正确使用各种
    close()
    方法(使用空检查和最后的块),网上有很多例子。尽管如此,还是要担心一切事物的静态性质——这种类对于可测试性来说是一场噩梦。避免使用静态方法是值得的。@Fildor,我简化了自己来发布它。我在我的应用程序中使用了这段代码,它可以工作。。。问题是,我不确定这是一个良好的做法,涉及到连接。我读过关于连接池的文章,但它看起来相当复杂。不创建JDBC驱动程序类的新实例将帮助您消除InstanceionException和IllegalAccessException谢谢,Tim。我将用你的第二个技巧来举第二个例子。然后我会把手放在一些连接池研究D:
    public class Persistence {
    
        static final String JDBC_DRIVER = "com.mysql.jdbc.Driver";
        static final String DB_URL = "jdbc:mysql://localhost/myDB";
        static final String USER = "user";
        static final String PASS = "pass";
        private static Connection con;
    
        static {
            openConnection();
        }
    
        private static boolean openConnection() {
            try {
                Class.forName(JDBC_DRIVER).newInstance();
                con = DriverManager.getConnection(DB_URL, USER, PASS);
                return true;
            } catch (InstantiationException ex) {
                ex.printStackTrace();
                return false;
            } catch (IllegalAccessException ex) {
                ex.printStackTrace();
                return false;
            } catch (ClassNotFoundException e) {
                e.printStackTrace();
                return false;
            } catch (SQLException e) {
                System.err.println("SQL problem: " + e.getMessage());
                return false;
            }
        }
    
        //----------EXAMPLE QUERY-----------
        public static String someQuery() throws SQLException {
            Statement st = con.createStatement();
            ResultSet rs = st.executeQuery("SELECT column FROM myDB");
            String data;
            while (rs.next()) {
                data = rs.getString("column");
            }
            rs.close();
            st.close();
            return data;
        }
    }
    
    public static String someQuery() throws SQLException {
        openConnection();
        Statement st = con.createStatement();
        ResultSet rs = st.executeQuery("SELECT column FROM myDB");
        String data;
        while (rs.next()) {
            data = rs.getString("column");
        }
        rs.close();
        st.close();
        con.close();
        return data;
        }