论坛首页 入门技术论坛

java线程死锁与内存溢出

浏览 36531 次
该帖已经被评为新手帖
作者 正文
   发表时间:2009-01-13  
哎,我的问题与楼主的差不多,真的很郁闷!!!!
0 请登录后投票
   发表时间:2009-01-13  
开源框架现在很强大,还要自己写连接池。
0 请登录后投票
   发表时间: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...
}
0 请登录后投票
   发表时间:2009-01-13  
根源写连接池的时候没有考虑多线程并发的问题.
0 请登录后投票
   发表时间: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了,产生死锁也就在情理之中了。
0 请登录后投票
   发表时间:2009-01-14  
如果编码功底和对连接池的认识不够足够深刻的话,当然还是建议用开源的。
如果LZ对这部分很感兴趣,可以去参考一些专业点的书籍。
我听一位高手说过光基本原理就能说一个小时。而不是咱们所说的这么简单。
0 请登录后投票
   发表时间:2009-01-16  
#     protected void finalize(){ 
#         ConnClose(); 
#     } 

是这样的么?
0 请登录后投票
   发表时间:2009-01-16  
一般连接阻塞是因为在等待数据库结构或者是连接没有关闭.

第一 你数据库的网络服务连接不行
第二  SQL操作会不会有长时间不返回的情况,比如 SELECT  是不是会进行全表扫描.DELETE是不是一次删除太多记录等.
第三 连接使用后为进行关闭

建议使用设计模式去弥补这个问题,应用回调切面等.
0 请登录后投票
   发表时间:2009-01-26  
弱弱说,怎么看楼主贴的代码不像是单例的。建议楼主自己测试下,看看不是创建连接池的那段代码是不是真的只会执行一次。

最后再次弱弱的说,建议楼主看看别人单例的代码是怎么写的,也许楼主写的是单例的,可是看起来很别扭。
0 请登录后投票
   发表时间: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;
}
0 请登录后投票
论坛首页 入门技术版

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