论坛首页 入门技术论坛

java线程死锁与内存溢出

浏览 36014 次
该帖已经被评为新手帖
作者 正文
   发表时间:2009-01-06  
kill -3 一下, 看下就知道是不是lock了。 这么简单。 哈哈
0 请登录后投票
   发表时间:2009-01-06  
连接池虽然原理简单,但是要在多线程环境下工作良好且效率高、提供可以跟踪未关闭连接等特性就不那么简单了。
一般而言,还是不要自行实现连接池,用现成的DBCP就比你自己的强很多。
一般来说,每个AppServer都有自己内置的连接池,只需要配置一下就行。
0 请登录后投票
   发表时间:2009-01-06  
就是因为线程比较复杂,所以才有了很多久经考验的连接池,缓存啊什么的,放着好东西不用,干嘛非要自己实现,劝你如果有时间,还是换成网上开源的连接池吧,否则以后再出什么问题就麻烦了。
0 请登录后投票
   发表时间:2009-01-06   最后修改:2009-01-07
zhangxi123 写道
icyiwh 写道
  为什么会有2个线程同时获取同一个Connection?
  你是在WEB层获取Connection吗?如果这样,似乎在设计上不可取!
  如果是在应用层(逻辑层),那么每一个请求都是一个独立的线程,不存在同时多个线程同时访问一个Connection的

这和在什么地方获取连接没关系,tomcat是可以多线程并发访问的,当有两个并发的线程同时在连接池中获取同一个连接的时候就会出现线程死锁,而导致我说的那个结果!


有这种说法吗?你这里的线程不安全,是因为你在一个实例方法里面new了你的broker对象(静态对象为什么不在构造函数中new,是为了节省内存?还有Data中的方法为什么不用static的,确去把Data搞成单例?),多个线程同时去调不是new了一大堆DDConnectionBroker对象?所以sychronized才能解决你的问题。

你设计有问题,建议:
1、把方法改成静态的
2、在broker声明时new,如果内存不紧张的话
3、那个conn对象搞什么啊,乱七八糟的,作为实例变量干嘛?
4、不要在getConnection和ConnClose前面加synchronized,会影响性能,实在你前面不肯在broker声明时new的话,也应该在getConnection内部new对象的时候加synchronized块,你好好看看java的synchronized用法吧。
0 请登录后投票
   发表时间:2009-01-06  
自己的多线程知识不过关啊!还是不要自己写这些东西好
0 请登录后投票
   发表时间:2009-01-06   最后修改:2009-01-06
seraphim871211 写道
zhangxi123 写道
icyiwh 写道
  为什么会有2个线程同时获取同一个Connection?
  你是在WEB层获取Connection吗?如果这样,似乎在设计上不可取!
  如果是在应用层(逻辑层),那么每一个请求都是一个独立的线程,不存在同时多个线程同时访问一个Connection的

这和在什么地方获取连接没关系,tomcat是可以多线程并发访问的,当有两个并发的线程同时在连接池中获取同一个连接的时候就会出现线程死锁,而导致我说的那个结果!


有这种说法吗?你这里的线程不安全,是因为你在一个实例方法里面new了你的broker对象(静态对象为什么不在构造函数中new,是为了节省内存?还有Data中的方法为什么不用static的,确去把Data搞成单例?),多个线程同时去调不是new了一大堆DDConnectionBroker对象?所以sychronized才能解决你的问题。

你设计有问题,建议:
1、把方法改成静态的
2、在broker声明时new,如果内存不紧张的话
3、那个conn对象搞什么啊,乱七八糟的
4、不要在getConnection和ConnClose前面加synchronized,会影响性能,实在你前面不肯在broker声明时new的话,也应该在getConnection内部new对象的时候加synchronized块,你好好看看java的synchronized用法吧。

其实是楼住的连接池写的有问题,同一个连接给了两个线程吧!不用同步是不太可能的了!
0 请登录后投票
   发表时间:2009-01-06  
楼主为什么要自己写连接池。。。。。
0 请登录后投票
   发表时间:2009-01-06  
yunsong 写道
seraphim871211 写道
zhangxi123 写道
icyiwh 写道
  为什么会有2个线程同时获取同一个Connection?
  你是在WEB层获取Connection吗?如果这样,似乎在设计上不可取!
  如果是在应用层(逻辑层),那么每一个请求都是一个独立的线程,不存在同时多个线程同时访问一个Connection的

这和在什么地方获取连接没关系,tomcat是可以多线程并发访问的,当有两个并发的线程同时在连接池中获取同一个连接的时候就会出现线程死锁,而导致我说的那个结果!


有这种说法吗?你这里的线程不安全,是因为你在一个实例方法里面new了你的broker对象(静态对象为什么不在构造函数中new,是为了节省内存?还有Data中的方法为什么不用static的,确去把Data搞成单例?),多个线程同时去调不是new了一大堆DDConnectionBroker对象?所以sychronized才能解决你的问题。

你设计有问题,建议:
1、把方法改成静态的
2、在broker声明时new,如果内存不紧张的话
3、那个conn对象搞什么啊,乱七八糟的
4、不要在getConnection和ConnClose前面加synchronized,会影响性能,实在你前面不肯在broker声明时new的话,也应该在getConnection内部new对象的时候加synchronized块,你好好看看java的synchronized用法吧。

其实是楼住的连接池写的有问题,同一个连接给了两个线程吧!不用同步是不太可能的了!


呵呵,是啊,所以我说他设计有问题,应该研究透了再来说,把错误的经验讲给别人,要是懒点的新手不就被误导了。
0 请登录后投票
   发表时间:2009-01-07  
不折腾。。。

楼主是新手把,去折腾hibernate,ibatis, 别折腾这个connection了。
0 请登录后投票
   发表时间:2009-01-07  
感觉不是数据库连接的事
你用glassfish做服务器试试~
0 请登录后投票
论坛首页 入门技术版

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