100分问数据库连接该怎样关闭

SnowwhiteYqw 2008-06-18 09:19:44
100分高分急问!求高手帮忙解决
我在一个函数里执行查询操作,返回结果ResultSet,在后面对ResultSet进行操作。
请问操作完之后该怎样关闭Statement和ResultSet?
因为涉及到大量的查询操作,为了防止内存溢出,需要正确、及时地释放连接。
代码如下所示:
//返回ResultSet结果的函数

public java.sql.ResultSet executeQuery(String sexesql) throws SQLException {
java.sql.ResultSet rs = null;
Statement stmtDb = conn.createStatement();
try {
rs = stmtDb.executeQuery(sexesql);
} catch (SQLException e) {
System.err.println("ERROR IN Execute :" + sexesql + " : " + e);
} catch (NullPointerException e) {
}
return (rs);


//调用的代码

while (rs.next()) {
long id = rs.getLong(1);
if (!isDeleted(id)) {
PathwayBean pb = new PathwayBean();
pb.selectDataFromDBByID(id);
list.add(pb);
}
}
rs.getStatement().close();//这两行关闭行吗?
rs.close();//这行应该可以省略吧?
...全文
287 42 打赏 收藏 转发到动态 举报
写回复
用AI写文章
42 条回复
切换为时间正序
请发表友善的回复…
发表回复
nec_258 2008-06-20
  • 打赏
  • 举报
回复
guoxujie 2008-06-20
  • 打赏
  • 举报
回复
rs.getStatement().close();//这两行关闭行吗?
rs.close();//这行应该可以省略吧?


==================================
最好是这样:
if(rs !=null){
try{
rs.close();
}catch(Exception e){
System.out.println(e);
}
}
dryZeng 2008-06-20
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 TRMeister 的回复:]
1.楼主这样调用结构不好。首先你的Connection并没有关闭。
rs.getStatement().close();//这个是官Statement
rs.close();//这个是关闭ResultSe
2.如果你的代码有异常抛出的话,你的Statement和ResultSet也都关不掉。
3.最后ResultSet最好不要当成任何返回值返回。应该直接返回VO,数据对象。


改进方法
比如一个数据对象 Actor类。可以根据自己的需要更改。

Java code
public class Actor {

p…
[/Quote]


qq278095755 2008-06-19
  • 打赏
  • 举报
回复
[Quote=引用 22 楼 SnowwhiteYqw 的回复:]
我有很多种查询,每个查询量又很大、很多。
我的Connection用的是Singleton模式,并不是每种(批)查询完都关闭。
请问这种设计好吗?还是应该每批查询完成之后,关闭所有的ResultSet、Statement和Connection,好呢?
[/Quote]
不好.应该是跟数据库交互都要新建一个连接.
就像23楼说的:" 哪儿拿到的哪儿关闭".
zidasine 2008-06-19
  • 打赏
  • 举报
回复
学习一下,
一般关的时候习惯于在finally{}里按resultset, statement,connection关
即使关闭connection后,statement及resultset会自动关闭

sagezk 2008-06-19
  • 打赏
  • 举报
回复
总是来晚,总结一下:
1. 哪儿拿到的哪儿关闭。
2. 关闭放 finally 里免得抛异常关闭执行不到。
3. 数据流动方向 DB -> RS -> Bean -> View。
SnowwhiteYqw 2008-06-19
  • 打赏
  • 举报
回复
我有很多种查询,每个查询量又很大、很多。
我的Connection用的是Singleton模式,并不是每种(批)查询完都关闭。
请问这种设计好吗?还是应该每批查询完成之后,关闭所有的ResultSet、Statement和Connection,好呢?

public static PathwayDBUtil getInstance(String name){
if (dBUtilInstace == null){//用Singleton模式,只有一个实例
dBUtilInstace = new PathwayDBUtil();
url="jdbc:sqlserver://192.168.2.5:1433;DatabaseName="+name;
dBUtilInstace.openConn();
}
return dBUtilInstace;
}
private void openConn() {//打开数据库连接
try {
Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");
conn = DriverManager.getConnection(url, user, pwd);

} catch (Exception e) {
e.printStackTrace();
}
}
public void closeConn() {//在所有批次查询都查完后最后关闭数据库连接
try {
if (conn == null) {
return;
}
conn.close();
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
conn.close();
} catch (Exception e) {
}
}
}
sunyuqian 2008-06-19
  • 打赏
  • 举报
回复
catch (SQLException e)
{
System.err.println("ERROR IN Execute :" + sexesql + " : " + e);
} catch (NullPointerException e)
{}
finally
{
try
{
rs.close();
} catch (Exception e)
{}
}

在catch后加finally代码块,无论有没有异常,都会执行 ,支持6楼
zk32373139 2008-06-19
  • 打赏
  • 举报
回复
按你的例子来说,我想按业务来关闭可能要好点
比方在java_web中,按你一次请求结束以后再关闭连接
hye4 2008-06-19
  • 打赏
  • 举报
回复
   /**
*
* @param rs ResultSet
* @param st Statement
* @param conn Connection
*/
public void closeConnections(ResultSet rs, Statement st, Connection conn)
{
if (rs != null)
{
try
{
rs.close();
}
catch (SQLException e)
{

}
}
if (st != null)
{
try
{
st.close();
}
catch (SQLException e)
{

}
}
if (conn != null)
{
try
{
conn.close();
}
catch (SQLException e)
{
}
}
}
hemaily 2008-06-19
  • 打赏
  • 举报
回复
最简单的 
if(!conn.isClosed)
{
conn.closed();
}
hemaily 2008-06-19
  • 打赏
  • 举报
回复
	public static void closeConnection(DBConnection dbc) {
if (dbc != null) {
try {
DBHT.remove(dbc.globeID);
useCnt--;
if (dbc.connection != null) {
dbc.connection.close();
String[] msg = { "DBFactory", "closeConnection",
dbc + " 关闭成功" };
TLoger.logDebug("2003", msg);
} else {
String[] msg = { "DBFactory", "closeConnection",
dbc + " 不存在联接" };
TLoger.logDebug("2003", msg);
}

} catch (SQLException ex) {
String[] err = { "DBFactory", "closeConnection", dbc + " 关闭失败" };
TLoger.logErr("3300", err, ex);
}
}
}
whitebase1234 2008-06-19
  • 打赏
  • 举报
回复
1。首先要放在finally里。
2。如果只是想释放资源可以直接将rs和st赋值为null。
3。建议写个JDBCUtil类,实现代码复用。
loujianchengdd 2008-06-19
  • 打赏
  • 举报
回复
rs.getStatement().close()
JJTwo 2008-06-19
  • 打赏
  • 举报
回复
學習!學習!學習!學習!學習!
ldy214 2008-06-19
  • 打赏
  • 举报
回复
public static void close(Statement st, Connection con)
{
try
{
st.close();
}catch(Exception e)
{
}

try
{
con.close();
}catch(Exception e)
{
}
}

public static void close(ResultSet rs, Statement st, Connection con)
{
try
{
rs.close();
}catch(Exception e)
{
}
close(st, con);
}

单独写一个类,专门用于连接、关闭的util
dengfeiling 2008-06-19
  • 打赏
  • 举报
回复
就一个close方法,还用研究吗~~~
一洽客服系统 2008-06-19
  • 打赏
  • 举报
回复
第一写专门的方法判断需要关闭的对象是否为null后进行关闭,如果在发生异常程序不能继续往下运行的话,最好用fianlly块里关闭连接
xulihmily1314 2008-06-19
  • 打赏
  • 举报
回复
finally{
rs.close();
con.close();
}
burningice44 2008-06-19
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 ilrxx 的回复:]
conn.close();//关闭数据库连接对象
stmtDb.close();//关闭操作数据库对象
[/Quote]
加载更多回复(21)

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧