JAVA WEB 系统问题整理; apache + tomcat + mysql + win server 2003

 

1   tomcat的OutOfMemoryError.


        常见的有heap 和 PermGen的内存溢出 , 但遇到" java.lang.OutOfMemoryError: unable to create new native thread "这个异常的 

        时候还是有点不知所措.
      
  后查阅得知在32位windows server 2003中, 一个进程可以使用的最大内为2G , 而我们为tomcat的heap+perm就分配了1.5G , 而又

        没有限制栈的大小, 且系统使用了  ehcache, 使用jconsole观察系统启动时就有将近600个线程 , 其中大部分的是ehcache的(为每 

       个表生成两个守护线程) , 而系统线程最大值只能为784! 我们的系统有  点特殊, 是受用独立schema的多租户系统,所以这种缓存对

        于我们目前来说,可以不用,所以就把ehcache关闭, 并且启用tomcat的线程池(启用conf/server.xml中的"Executor");

 


2 mysql+c3p0的各种异常.

 
          (1) 感触最深的就是"Can't create a new thread (errno 12); if you are not out of available memory, you can consult the manual for

               a possible OS-dependent bug"  这个异常啦 , 修改各种配置,并实时肉眼监控mysql 连接 , 发现max_connection=1000的系统,

                  在创建了140个连接左右就宣告异常,物理内存和CPU都绰绰有余! 网上有各种说法,  注释"thread_concurrency" 的,修改各

                  种"size"的,都以失败而告终.后来我把服务器上的配置替换我本地的my.ini,用loadrunner进行200用户并发,结果抛出的异常就

                “too many   connections!” 彻底傻X! 后来老大亲自出马,在老外的回复中隐约得知是"mysql 版本问题" ,服务器上的是遗留系

                 统 "mysql 5.0.45", 而我本地的是"5.5.1", 经测试后,决定  更换数据库版本 , 更换后,问题解决.


           (2) "java.io.EOFException: Can not read response from server. Expected to read 4 bytes, read 0 bytes before connection was

                  unexpectedly lost"   这个异常是最纠结的异常,知道数据库连接失效了,但怎么解决?因为我是使用了c3p0连接池的, 并且一个

                 相同配置的连接池运行良好(在同一上application中 , 同时运行) , 用   mysql administrator监控发现, 在抛出异常的连接池管

                  理的连接中,始终有一个连接不受连接池的控制 , 所以它始终会被数据库回收.当接下来再使用连接池获取的时候,就悲剧了.

                  经过两天的种种修改配置和模拟测试后,把这种异常的原因设想为"数据库连接的逃逸"!    首先是:人为直接不道德的使用

                 getConnection()之类的方法 ,但使用文件检索后,排除。   然后:hibernate session的遗漏!查看系统的数据库访问模

                 块后,有种想杀人的冲动: public Session getSession()( sessionFactory.openSession()}之类的代码! openSession
                 调用者必须显示的关闭它,否则c3p0以为connection一起处于忙碌状态,就不会使用maxIdleTime和test_period进行测试!

                  悲剧的修改代码后解决!
          (3) “java.sql.SQLException: An attempt by a client to checkout a Connection has timedout.”  
                 这个异常还在待解决中。。。。

 

  最后: 在这一段时间里,学到了很多东西, jconsole / jvisulVM / javamelody / memoryanalyzer , 以及tomcat/mysql/c3p0的种种配

                置 , 得出个结论: (1)不要怀疑公认的东西!   (2) 敢于怀疑一切。在被这种多租户系统各种体会弄死的同时,确实尝到

                了很多东西。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值