我不确定这段代码是否正确。我从我的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;
}
感谢您的回答。
答案 0 :(得分:2)
static
块仅执行一次,因此您打开一个连接,然后在程序期间保持打开状态。
这确实有效,但由于多种原因而存在缺陷。例如,一旦启动多线程,它就完全没用了。
你的第二个例子更好但仍有缺陷,最好的方法是:
使用连接池保持连接打开,在需要时从池中请求连接。
使用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的一部分实现的。只是谷歌它,你会得到更多的信息