锁定老帖子 主题:java线程死锁与内存溢出
该帖已经被评为新手帖
|
|
---|---|
作者 | 正文 |
发表时间:2009-01-13
哎,我的问题与楼主的差不多,真的很郁闷!!!!
|
|
返回顶楼 | |
发表时间:2009-01-13
开源框架现在很强大,还要自己写连接池。
|
|
返回顶楼 | |
发表时间:2009-01-13
1 功能问题,如果Conn = broker.getConnection();异常,此时conn是null,执行以后的操作只能NullPointException
2 之前有人说的那样,conn,stmt 占的资源可能无法释放,具体要看你的具体实现 3 不要方法同步,从命名看,getConnection应该是并发的,方法同步对性能影响异常大,同步可以在方法内处理: public void getConnection{ if (broker == null||(!this.type.equals(this.type2))) { synchronized(lock){ if (broker == null||(!this.type.equals(this.type2))){ //TODO:初始化操作 } } } //TODO:go on... } |
|
返回顶楼 | |
发表时间:2009-01-13
根源写连接池的时候没有考虑多线程并发的问题.
|
|
返回顶楼 | |
发表时间:2009-01-14
# if (broker == null||(!this.type.equals(this.type2)))
# { # this.getProperties(); # # this.type2=this.type; # try{ # broker = new DDConnectionBroker(StrDrive, # StrUrl, # StrDbUsername, # StrDbPassWord, # IntMinConnectionCount, # IntMaxConnectionCount, # 100, # 60000, # ""); # } # ...... LZ这么写并不能保证线程安全的,试想当2个进程同时运行到if代码的时候,是同时满足条件的,但是如果都进入的if代码块,你里面就会产生2个connection了,产生死锁也就在情理之中了。 |
|
返回顶楼 | |
发表时间:2009-01-14
如果编码功底和对连接池的认识不够足够深刻的话,当然还是建议用开源的。
如果LZ对这部分很感兴趣,可以去参考一些专业点的书籍。 我听一位高手说过光基本原理就能说一个小时。而不是咱们所说的这么简单。 |
|
返回顶楼 | |
发表时间:2009-01-16
# protected void finalize(){
# ConnClose(); # } 是这样的么? |
|
返回顶楼 | |
发表时间:2009-01-16
一般连接阻塞是因为在等待数据库结构或者是连接没有关闭.
第一 你数据库的网络服务连接不行 第二 SQL操作会不会有长时间不返回的情况,比如 SELECT 是不是会进行全表扫描.DELETE是不是一次删除太多记录等. 第三 连接使用后为进行关闭 建议使用设计模式去弥补这个问题,应用回调切面等. |
|
返回顶楼 | |
发表时间:2009-01-26
弱弱说,怎么看楼主贴的代码不像是单例的。建议楼主自己测试下,看看不是创建连接池的那段代码是不是真的只会执行一次。
最后再次弱弱的说,建议楼主看看别人单例的代码是怎么写的,也许楼主写的是单例的,可是看起来很别扭。 |
|
返回顶楼 | |
发表时间:2009-02-04
你那个broker不一定是单例,虽说你那样写看起来像。。。
单例要么在单例类中写一个自身引用并在构造方法中new一个实例赋予引用,给予一个方法getInstance()或其他什么return这个引用以获取单例,不用同步什么什么的,因为此实例在类加载的时候就初始化了,这就是所谓的饿汉式单例模式,但这种模式有个不好的地方就是当出现误操作(比如将此引用设置为null),这个实例你就不可能再实例化了。 还有就是所谓的懒汉式,在getInstance()方法中判断: private static Factory instance = null; //此类为单例模式,只能通过此方法获取实例 public static Factory getInstance(){ //双锁检测单例模式 if(instance==null){ synchronized(Factory.class){ if(instance==null){ instance = new Factory(); } } } return instance; } |
|
返回顶楼 | |