在三层架构DAL层多次开启和关闭Connection对象好吗? 本帖最后由 u011688498 于 2015-01-04 17:50:16 编辑 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 主要是性能方面的问题,其他的没什么!!!就怕性能不足!!!但是又不想让BLL层接触数据库的东西,达到分层效果。 不要这么做,我在 CSDN 强调过不下 10 次了,不要把 Connection 等 JDBC 对象弄成静态的,这会产生非常严重的问题。JDBC connection 讨论http://bbs.csdn.net/topics/360027520#post-361821072Connection能设置成静态的吗http://bbs.csdn.net/topics/350052222#post-351357361 还是不是很懂,连接泄漏这方面的问题,那应该怎么做?在三层架构里面,我不想DAL和BAL耦合太大,求支招! 一个Connection 的开启和关闭一般用于代表一个事务,对于Connection ,设置为一个成员变量的时候,当出现多线程调用这个Connection 成员变量,如果不处理同步问题,则可能你在线程1中调用这个Connection成员变量的时候,发现这个是一个空指针,于是就新建了一个Connection,但是如果同时线程2也在跑,也同时发现这个是一个空指针,同样新建了一个Connection(多线程就是这样的,因为你没有处理异步问题) ,这样你的Connection 关闭就很有问题了,并且可能会很快占用完数据库连接(new 了太多Connection)!所以最佳的做法就是,每次操作数据库之前都独立获取一个Connection对象,并且操作完之后对其进行关闭!也就很好地保证了事务的一致性以及代码的同步操作。 可以把每次单独获取Connection和prepareStatement的代码写到一起提供复用。多次开启和关闭独立的Connection是没有问题的,一般都是这么做的,如果想更加优化,一般推荐使用连接池! 你的代码都不是性能问题了,是肯定会出多线程问题。除非你能保证,同一时间SqlHelper只有一个线程被调用。A线程调用了getPreparedStatement,B线程也调用了getPreparedStatement这时候A先调用结束然后调用了closeConnection关掉了Connection,那么等B线程调用结束后如何关掉B线程用的Connection?这个Connection就泄漏了,迟早会达到数据库连接上限。所以建议是除非你能保证,同一时间只有一个线程调用SqlHelper上的方法,不然别这么做。你可以使用DataSource数据源,这都说烂的事了。比如C3P0之类的,你只需要问他拿Connection使用完调用close就可以了。性能由C3P0来保证。当然数据源实现有好多种了。 可以把每次单独获取Connection和prepareStatement的代码写到一起提供复用。多次开启和关闭独立的Connection是没有问题的,一般都是这么做的,如果想更加优化,一般推荐使用连接池!可以给各小例子吗?谢谢,我不知道怎么复用,是静态还是动态的?! 好,后面我把数据库SQLHelper写成动态的了,不知道这样行不行,我也在多线程环境下调用过,在SQL Manager看连接,在程序结束后就没有连接了,应该是没问题了,以后再用C3P0,谢谢 简单的Junit测试 集成问题 eclipse中hibernate插件的使用 struts2中action如何让一个方法总被执行? 求救:http请求怎么携带上传附件啊??请各位高手指点 为什么这条语句总是返回false呢??? jboss+myeclipse部署问题 菜鸟求教 在线急等 小弟请教一个webService 调用的问题 LINUX下 APACHE2.0.55+TOMCAT5整合最后一部jk2-2.0.4使用时过不了了,出现以下错,急等 新手:帮我介绍以下ActiveX好吗 log4j继承问题 java 调用.net webservice 服务报错 在线等。。。
http://bbs.csdn.net/topics/360027520#post-361821072Connection能设置成静态的吗
http://bbs.csdn.net/topics/350052222#post-351357361
还是不是很懂,连接泄漏这方面的问题,那应该怎么做?
在三层架构里面,我不想DAL和BAL耦合太大,求支招!
一个Connection 的开启和关闭一般用于代表一个事务,对于Connection ,设置为一个成员变量的时候,当出现多线程调用这个Connection 成员变量,如果不处理同步问题,则可能你在线程1中调用这个Connection成员变量的时候,发现这个是一个空指针,于是就新建了一个Connection,但是如果同时线程2也在跑,也同时发现这个是一个空指针,同样新建了一个Connection(多线程就是这样的,因为你没有处理异步问题) ,这样你的Connection 关闭就很有问题了,并且可能会很快占用完数据库连接(new 了太多Connection)!
所以最佳的做法就是,每次操作数据库之前都独立获取一个Connection对象,并且操作完之后对其进行关闭!也就很好地保证了事务的一致性以及代码的同步操作。
可以把每次单独获取Connection和prepareStatement的代码写到一起提供复用。多次开启和关闭独立的Connection是没有问题的,一般都是这么做的,如果想更加优化,一般推荐使用连接池!
可以把每次单独获取Connection和prepareStatement的代码写到一起提供复用。多次开启和关闭独立的Connection是没有问题的,一般都是这么做的,如果想更加优化,一般推荐使用连接池!
可以给各小例子吗?谢谢,我不知道怎么复用,是静态还是动态的?!
好,后面我把数据库SQLHelper写成动态的了,不知道这样行不行,我也在多线程环境下调用过,在SQL Manager看连接,在程序结束后就没有连接了,应该是没问题了,以后再用C3P0,谢谢