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) 敢于怀疑一切。在被这种多租户系统各种体会弄死的同时,确实尝到
了很多东西。