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