论坛首页 入门技术论坛

java线程死锁与内存溢出

浏览 36017 次
该帖已经被评为新手帖
作者 正文
   发表时间:2009-01-07  
我说的打开关闭连接指的是就是从连接池中获取释放连接。也就是调用他这里的DDConnectionBroker.getConnection()和DDConnectionBroker.freeConnection()
0 请登录后投票
   发表时间:2009-01-07  
连接池,最少有2年没写过了。。。。。用的都是项目封装好的。。。。。
0 请登录后投票
   发表时间:2009-01-07  
新手贴,不过还有个jprofile这玩意的使用,貌似相当高级啊,我都没用过
0 请登录后投票
   发表时间:2009-01-08  
Lucas Lee 写道
连接池虽然原理简单,但是要在多线程环境下工作良好且效率高、提供可以跟踪未关闭连接等特性就不那么简单了。
一般而言,还是不要自行实现连接池,用现成的DBCP就比你自己的强很多。
一般来说,每个AppServer都有自己内置的连接池,只需要配置一下就行。


同意,我想加入同步,是线程安全要做的,防止同时去取connection
0 请登录后投票
   发表时间:2009-01-08  
wangdi 写道
marlonyao 写道

zhangxi123 写道
如果我就要在这段代码的基础上改的话该如何修改呢??请大家给出代码示例(在Data的基础上),真心请教!谢谢!



先不说别的,你写的代码很不专业:

  1. 命名不符合java习惯。这个Data给我的感觉是由相当多的人一起写的,风格很不统一。名字取得相当随意,Data像是做数据库操作的类吗?
  2. 异常处理存在很大问题,在这么底层就把所有的异常给吃掉了。
  3. 滥用实例变量。

总之,基础还太差,Java没有学习一个月就开始做项目了吧。

 

 

将getConnection()和connClose()加上synchronized就能够解决问题吗?Data中有这么多实例变量(connection, stat),居然还把它做单例,真是不可思议!一个线程关闭的连接可能是由另一个线程所打开的。真不知道你这样做是怎么控制事务的?如果这样修改,我觉得问题仍然没有解决,只是可能你暂时还没有发现而已。

 

我建议是:

  1. 不将Data做成单例。
  2. 或者将connection, stat实例变量从Data中移去,每次执行数据库操作时就打开连接,完成时关闭连接。这种方式是我推荐的,对现存代码影响最小。

 

还要更加努力的学习,切忌浮躁!


传说中的连接池会比较好吧?一直打开关闭也不是个办法。。。。现存代码该重构的就重构咯……

 

 

还是需要一个连接池的,可以节约资源,否则就疯狂的打开一个连接 关闭连接

0 请登录后投票
   发表时间:2009-01-08   最后修改:2009-01-08
前几天也发现一个由于线程死锁导致的后台程序阻塞,看了一下,应该是Hibernate有关Cache的一个BUG,在一种特殊情况下,Cache相关写日志会造成死锁。
看见源代码里有一个lock块不知道被谁注释掉了,当然没仔细研究是不是这个原因。
直接不输出Cache的日志了事。

得到的经验是不要一阻塞就光想到是内存溢出....
0 请登录后投票
   发表时间:2009-01-08  
partech 写道
得到的经验是不要一阻塞就光想到是内存溢出....


阻塞,内存溢出,这是啥结论。。
0 请登录后投票
   发表时间:2009-01-08  
jeffyan 写道
Lucas Lee 写道
连接池虽然原理简单,但是要在多线程环境下工作良好且效率高、提供可以跟踪未关闭连接等特性就不那么简单了。
一般而言,还是不要自行实现连接池,用现成的DBCP就比你自己的强很多。
一般来说,每个AppServer都有自己内置的连接池,只需要配置一下就行。


同意,我想加入同步,是线程安全要做的,防止同时去取connection


    有这一说吗?你都同步了,WEB应用在并发情况下,你准备让它通过几个?不懂不要乱讲从整个应用来讲连接池的使用大部份分为两冲,一种是在应用服务器配置,在你的WEB应用是通过JNDI去获取,另一种是使用开源的第三方组件,如DBCP,c3p0之类的。自已写的连接池,我个人认为没有扎实功底,就算你实现了也难保性能上不出问题。
    不知道楼上这位仁兄为什么会想到取连接的时候需要使用同步
0 请登录后投票
   发表时间:2009-01-08  
marlonyao 写道

我建议是:

  1. 不将Data做成单例。
  2. 或者将connection, stat实例变量从Data中移去,每次执行数据库操作时就打开连接,完成时关闭连接。这种方式是我推荐的,对现存代码影响最小。

 

 


觉得marlonyao兄说的对,我们也一直是这么做得!

另外,觉得LZ所有的操作都在Data类里面做,感觉有些怪怪的,有没有哪位仁兄具体说明一下这样做的问题啊,

觉得这样做确实存在多线程的时候关闭出现错误的问题。

例外,LZ写得单例实在是跟我的认识有些差别,呵呵,建议还是按照LS的ls的ls。。。。给的那个单例例子来写吧。

 

0 请登录后投票
   发表时间:2009-01-08   最后修改:2009-01-08
设计上很有问题
0 请登录后投票
论坛首页 入门技术版

跳转论坛:
Global site tag (gtag.js) - Google Analytics