Java里的如果ResultSet关闭 Connection自动关闭怎么实现

问题描述

C#里有CommandBehavior.CloseConnection这个东西Java里有吗?或者有没类似功能?我有个方法想返回一个ResultSet关闭后连接对象也关闭

解决方案

解决方案二:
java中可以直接关闭获得的Connection实例,关闭数据库连接实例后,所有建立在这个数据库实例上面的资源,结果集便自动关闭
解决方案三:
该回复于2014-09-22 08:45:05被版主删除
解决方案四:
你可以每次都去关闭ResultSet,pstmt,conn等资源。但是如果你直接关闭connection的话,这个conn上的其他资源也会被关闭,就像楼上说的那样
解决方案五:
对于connection、resultset等等之类的资源,建议的做法是:遵循谁打开谁关闭,尽量不要在一个方法中打开传入另一个方法中关闭,这样很容易出问题。
解决方案六:
如果有resultSet的话,一般会有try-catch模块,你可以再catch模块后面的finally模块里面把连接都关了,这样在处理完resultset后会关闭你打开的连接
解决方案七:
引用4楼rumlee的回复:

对于connection、resultset等等之类的资源,建议的做法是:遵循谁打开谁关闭,尽量不要在一个方法中打开传入另一个方法中关闭,这样很容易出问题。

这个原则确实是这样的,不过有个特殊的例子:在验证用户登录的时候,是不是只能用下面的步骤?1.先将结果集返回给调用者;2.然后提供一个关闭自身资源的方法;3.最后在调用者完成结果集操作之后,调用关闭资源的方法。
解决方案八:
conn.close;
解决方案九:
可以动态代理,重新resultSet的的close方法
解决方案十:
难道不能转换成一个简单的类似vo这种只包括数据的对象么?到了业务模型的深层不应该再依赖这个连接是否关闭这个条件了吧,业务层应该只知道有数据和没有数据。引用6楼sparrow00004的回复:

Quote: 引用4楼rumlee的回复:
对于connection、resultset等等之类的资源,建议的做法是:遵循谁打开谁关闭,尽量不要在一个方法中打开传入另一个方法中关闭,这样很容易出问题。

这个原则确实是这样的,不过有个特殊的例子:在验证用户登录的时候,是不是只能用下面的步骤?1.先将结果集返回给调用者;2.然后提供一个关闭自身资源的方法;3.最后在调用者完成结果集操作之后,调用关闭资源的方法。

解决方案十一:
可以考虑在login去调用一个持久层访问statement时提供一个callback让它来自己取数据。持久层只负责连接到数据库并执行SQL,至于ResultSet中的数据如何使用则用callback来负责,查询完了立即关闭了连接。如:publicvoiddoQuery(Stringsql,Fillercallback){...try{callback.beginData();while(rs.next()){callback.next();}callback.endData();}catch(SQLExceptione){callback.processException(e);}try{rs.close();stmt.close();conn.close();}catch(SQLExceptione){//这里不是Callback的职责。}}

解决方案十二:
如果是javaweb程序,可以在web里加一个过滤器,得到的连接全部放到request里,或者通过ThreadLocal存储当前线程使用的Connection,当返回时,则从request或者从ThreadLocal中取出Connection,并且关闭它。这样,程序别的地方就不用关心连接是否被关闭的事了。

时间: 2024-12-01 03:36:39

Java里的如果ResultSet关闭 Connection自动关闭怎么实现的相关文章

编程-在weblogic上部署JAVA WEB项目,为什么关闭之后最小的连接数不会自动关闭

问题描述 在weblogic上部署JAVA WEB项目,为什么关闭之后最小的连接数不会自动关闭 在项目中设置的最小连接数是2 初始连接数是5,当我开启这个项目的时候发现连接池中的连接数加了5个,因为我设置了maxIdleTime属性,过了一会有3个连接数因为空闲会被关闭,但是那2个最小的连接数一直不会关闭,就算在服务器上把这个应用停止了也不会关闭,这要怎么处理呢? 项目是spring+strtuts2+hibernate 连接池用的是c3p0 解决方案 出于性能的考虑,底层连接池会保持连接,这是

在三层架构DAL层多次开启和关闭Connection对象好吗?

问题描述 在DAL层中,每次执行查询以后都会关闭prepareStatement对象和Connection对象,请问这样做合适吗?我的SQLHelper写成是静态的了,DAL层每个查询都从SQLHelper中获取一个PrepareStatement对象,然后每次执行完对应的查询后都会关闭pstmt对象和connection对象,然而这只是在DAL层,在BLL层中一般会调用1-5个DAL的方法,也就是说,一轮业务逻辑下来,Connection对象会开启和关闭1-5次,这样对性能有影响吗?有没有高手

JAVA里字符编码的探索与理解

编码 今天终于把JAVA里一个比较头痛的问题--字符编码弄清晰了,所以写一篇文章来纪念一下,也为大家提供一点自己的心得. 众所周知,JAVA为了国际通用,用的是UNICODE来保存里面的字符.而UNICODE只是一个种字符集,字符的存储和表示要用到一定的字符编码格式,而与UNICODE对应的字符编码格式就是我们常看到的UTF-8,UTF-16等等,而UTF-8是最常用的,所以人们常常把它和UNICODE等同起来(我以前就是这样的),这在某些情况下是没有错的,但这样的理解在JAVA里就会产生一些混

java 里窗体加了 几个按钮 然后在怎么设置背景色和背景图片

问题描述 java 里窗体加了 几个按钮 然后在怎么设置背景色和背景图片 如题,窗体里加了标签和按钮,再加背景色就一闪而过 背景图片怎么加 解决方案 http://zhidao.baidu.com/link?url=eEYFH5eyyVcfp7F5tICkBVLIwoh7o6arHCe3PNc2jT8GVuqwhYx3nTIbSXr52sSOQwaIWbzceaVj3kNYdv1mJ_

continue-关于java里的异常处理

问题描述 关于java里的异常处理 int k,l; do{ k = 0; try{ l = input.nextInt(); }catch(Exception e){ System.out.println("命令输入错误!请根据提示输入数字命令!"); k = 1; continue; } }while(k == 1); 这段代码,只要执行到continue,就不让我再次输入l了,而是死循环,为什么? 解决方案 l = input.nextInt(); 每次都会从输入读取下一个值,而

代码-请问大神们Java里的JPanel.repaint和JFrame.repaint的区别是什么?

问题描述 请问大神们Java里的JPanel.repaint和JFrame.repaint的区别是什么? Java小白一个,在看headfirst JAVA,书上有一个小的动画代码,是每个几秒画一个圆 然后圆的位置不断变化,书上故意用了JPanel.repaint这个方法,结果产生了运动痕迹, 然后书上提出的解决方法是repaint的时候先画一个大的白色的正方形把原来的圆盖住, 然后才画下一个圆.我实践的时候突发奇想用了JFrame.repaint来代替这个 JPanel.repaint,结果发

java里的多态理解的模模糊糊的,到底什么是多态?多态和类是什么关系?和对象呢?

问题描述 java里的多态理解的模模糊糊的,到底什么是多态?多态和类是什么关系?和对象呢? java里的多态理解的模模糊糊的,到底什么是多态?多态和类是什么关系?和对象呢? 解决方案 多态,顾名思义就是一种概念,多种形态. 在Java中,泛型.继承和复写方法.函数重载都体现了多态. 具体你可以看维基百科上对应的词条. 解决方案二: 你只要记住 1.同一类中,方法的**重载**是多态的体现. 2.在不同的类中(继承),方法的**重写**也是多态的体现 解决方案三: 需要搞清楚面向对象的三大特征,封

java里的断点怎么用,不是很会

问题描述 java里的断点怎么用,不是很会 java断点不是一步一步的走吗?怎么我的是直接走到下一个断点.有没有java断点的教程?怎么用?一步一步,具体的教程! 解决方案 结合上面的图,我说一下1 你在某处代码点击,然后开始运行程序,程序从断点一行开始运行,2 如果这行是方法,你应该走进去看,也就是按step into ,这样,程序就走到方法里面了,页面会跳到该方法的详细代码里3 如果这行是不是方法,你应该点击step over 也就是 单步执行,遇到函数,不进入,函数当作一步执行 4 其实常

java-请教大神,再JAVA里 怎么把rgba转换成#类型呢??

问题描述 请教大神,再JAVA里 怎么把rgba转换成#类型呢?? 我现在得到的是一个 string 类型 rgba(102 0 255 0.506)怎么把这个转换成 # 这样的类型呢?我的意思是转换成 #33333 这样的? 解决方案 RGBA你有没有查过资料?最后的那个数值是alpha.是透明度.这个alpha和RGB本身是相互独立的.rgb(abc)对应的是(a<<16 | b<<8 | c)得到的表达式应该是:#ffffff 这样的,6个十六进制数表示的. 你写的#3333