最近给公司开发了个CMPP 和 SMGP 的关于直连移动电信网关的协议。
  实现非常简单, 但是在 主运行类里面直接加了 3个线程  一个心跳  一个网关接收  一个报告
 分别都是永真循环 每个线程循环里面 都sleep(300 -500) 左右的时间。
  估计在服务器运行了10天左右非常 稳定。
     但是最近这几天出现了  接收和心跳依然正常  但是从数据库取数据的线程不动了  而且我又加了 一个守护线程用来维护数据库的线程  出现异常system.exit(-1) 然后重启程序  可惜的是 程序并不退出 还是依然心跳和接收报告。  估计是死掉了。
   可是不知道怎么解决,为什么就这两天会死掉了。 之前也考虑过是不是用的连接池过多 (一共十多个程序都在扫一个库)在数据库处排队 导致假死。 可是我查询了数据库连接池上限 是 600  并发也就才 120  绰绰有余啊。
    望高手解答。 在线等!(分没多少了 全扔出去了)

解决方案 »

  1.   

    DataSource和DriverManager上都有setLoginTimeout()方法,用于调整超时设置,楼主试过没。
      

  2.   

    没有使用过。  我用的是proxool连接池  
      

  3.   

    proxool也有这个方法,不妨试试。
    另外,搜得这个,希望有所启发
    http://www.javaworld.com.tw/jute/post/view?bid=21&id=201890&tpg=16&ppg=1&sty=1&age=0#201890
      

  4.   

    你觉得会是因为 数据库操作过程异常,事物没提交 导致的 锁表么?还有一种情况,如果是window版本的was上用低版本dbcp,会出现数据源线程挂起情况,
    还有可能是高并发+持续大数据量导致系统内存耗尽,处理速度 会超慢,因为一直在做gc
    其它情况,看楼上和等楼下吧
      

  5.   

     我觉得是后者的原因。 且程序是SE做的。
      底下说的 高并发+持续大数量如何解决比较合理  
      而且我守护线程发现数据库线程死掉以后整个程序也就死掉了 做 system.exit()动作 都不再响应。
      

  6.   

    楼主在多个线程之间有交互吗?如果各个线程都是独立的,不会导致整个程序阻塞的。
    关于System.exit()我觉得应该不是执行了没响应,而应该是其实并没有执行到这个指令。(这么说是不是比较暴力,只是希望楼主能早日解决问题吧)
      

  7.   

    查出来是oracle数据库来例假了  大概每隔一周都会出现此问题 重启数据库服务器就解决了。  程序本身没有问题 但是数据库方面我不知道怎么去解决 不知有大神遇到过类似问题如何解决的。