问题描述
我有点困惑,我从
连接conn = DriverManager.getConnection(
jdbc:somejdbcvendor:other data需要一些jdbc供应商,
myLogin,
myPassword);
语句stmt = conn.createStatement();
try {
stmt.executeUpdate(INSERT INTO MyTable(name)VALUES('my name'));
} finally {
//当你完成后关闭语句很重要
stmt.close();
}
您不需要关闭conn连接?
如果conn.close()没有发生,真正发生了什么?
我有一个私人网络应用程序,我目前没有关闭任何形式,但是重要的一个真正的stmt一个,conn一个,或两者?
网站会间歇性地关闭,但服务器一直说这是一个数据库连接问题,我怀疑它没有关闭,但我不知道如果有
当您完成使用连接
后,您需要通过调用其 close()
方法显式关闭它,以释放连接可能持有的任何其他数据库资源(游标,句柄等)。
实际上,Java中的安全模式是关闭您的 ResultSet
,当你完成后,在
finally
块中的和
Connection
类似:
连接conn = null;
PreparedStatement ps = null;
ResultSet rs = null;
try {
// Do stuff
...
} catch(SQLException ex){
//异常处理b $ b ...
} finally {
if(rs!= null){
try {
rs.close();
} catch(SQLException e){/ * ignored * /}
}
if(ps!= null){
try {
ps.close
} catch(SQLException e){/ * ignored * /}
}
if(conn!= null){
try {
conn.close
} catch(SQLException e){/ * ignored * /}
}
}
b $ b
finally
块可以稍微改进为(避免空检查):
} finally {
try {rs.close(); } catch(Exception e){/ * ignored * /}
try {ps.close(); } catch(Exception e){/ * ignored * /}
try {conn.close(); } catch(Exception e){/ * ignored * /}
}
,这是非常详细所以你通常最终使用一个帮助类关闭对象在安全的安全助手方法和 finally
块变成这样:
} finally {
DbUtils.closeQuietly(rs);
DbUtils.closeQuietly(ps);
DbUtils.closeQuietly(conn);
}
实际上,有一个这是正确的做法,所以没有必要自己写。
I am getting a little confused, I was reading the below from http://en.wikipedia.org/wiki/Java_Database_Connectivity
Connection conn = DriverManager.getConnection(
"jdbc:somejdbcvendor:other data needed by some jdbc vendor",
"myLogin",
"myPassword" );
Statement stmt = conn.createStatement();
try {
stmt.executeUpdate( "INSERT INTO MyTable( name ) VALUES ( 'my name' ) " );
} finally {
//It's important to close the statement when you are done with it
stmt.close();
}
Do you not need to close the conn Connection?What is really happening if the conn.close() doesn't occur?
I have a private web app I'm maintaining that doesn't currently close either form, but is the important one really the stmt one, the conn one, or both?
The site keeps going down intermittently but the server keeps saying it's a database connection issue, my suspicion is that it's not being closed, but I don't know which if any to close.
When you are done with using your Connection
, you need to explicitly close it by calling its close()
method in order to release any other database resources (cursors, handles, etc) the connection may be holding on to.
Actually, the safe pattern in Java is to close your ResultSet
, Statement
, and Connection
(in that order) in a finally
block when you are done with them, something like that:
Connection conn = null;
PreparedStatement ps = null;
ResultSet rs = null;
try {
// Do stuff
...
} catch (SQLException ex) {
// Exception handling stuff
...
} finally {
if (rs != null) {
try {
rs.close();
} catch (SQLException e) { /* ignored */}
}
if (ps != null) {
try {
ps.close();
} catch (SQLException e) { /* ignored */}
}
if (conn != null) {
try {
conn.close();
} catch (SQLException e) { /* ignored */}
}
}
The finally
block can be slightly improved into (to avoid the null check):
} finally {
try { rs.close(); } catch (Exception e) { /* ignored */ }
try { ps.close(); } catch (Exception e) { /* ignored */ }
try { conn.close(); } catch (Exception e) { /* ignored */ }
}
But, still, this is extremely verbose so you generally end up using an helper class to close the objects in null-safe helper methods and the finally
block becomes something like that:
} finally {
DbUtils.closeQuietly(rs);
DbUtils.closeQuietly(ps);
DbUtils.closeQuietly(conn);
}
And, actually, the Apache Commons DbUtils has a DbUtils
class which is precisely doing that so there is no need to write your own.
这篇关于在Java中关闭数据库连接的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!