这个打开/关闭JDBC连接代码是否正常?

时间:2014-02-10 07:53:36

标签: java mysql jdbc connection

我不确定这段代码是否正确。我从我的Java课程的一个例子中得到它,但我发现它实际上它永远不会关闭连接,并且异常看起来没有被正确捕获。 (我从我的业务层调用查询方法)。

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;
    }
}

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

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;
    }

感谢您的回答。

2 个答案:

答案 0 :(得分:2)

static块仅执行一次,因此您打开一个连接,然后在程序期间保持打开状态。

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

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

  1. 使用连接池保持连接打开,在需要时从池中请求连接。

  2. 使用try-finally块确保您在完成后始终关闭连接和/或将其返回池中。

答案 1 :(得分:0)

您无需创建JDBC Driver类的新实例

1)将其更改为Class.forName(JDBC_DRIVER).newInstance()到Class.forName(JDBC_DRIVER)

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

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

3)对于Connection,Statement和ResultSet使用try with resources块,因为所有三个接口都扩展java.lang.AutoCloseable。因此,您的资源总是关闭,而无需编写样板代码。此外,业务逻辑中的异常不会被关闭finally块中的资源时发生的任何异常所掩盖。

但当然你知道JDK7。这些是作为Project Coin的一部分实现的。只是谷歌它,你会得到更多的信息