c3p0连接池启动时 APPARENT DEADLOCK!!! 错误

在Windows平台下运行正常的应用部署到Linux服务器上之后,一直报错: com.mchange.v2.async.ThreadPoolAsynchronousRunner$DeadlockDetector@bbd1b — APPARENT DEADLOCK!!! Creating emergency threads for unassigned pending tasks!

查了好多论坛,发现跟iptables规则有很大关系,尝试关闭iptables,确实可以解决这个问题。那么iptables又不能一直关着,除了安全考虑外,还有一些nat和转发要通过iptables来做,所以iptables是必须要开的,那么就要看一下增加什么规则才能解决问题,

下面是我的常识步骤:
1. 关闭iptables
2. 启动tomcat(deploy应用时会自动启动连接池)
3. 查看mysql进程,连接mysql的地址:localhost
4. 在iptables增加规则:iptables -A INPUT -s 127.0.0.1/32 -j ACCEPT 这条规则的意思是:接受源自本机的所有访问,根据我目前的经验来看,没有增加明显的安全隐患;
5. 重新启动iptables
6. 重新启动tomcat,检查日志:发现连接池准备成功,问题被解决。

题外:访问我的应用之后,发现数据库访问失败,明明存在的表,hibernate又帮我创建了一个全是大写的同名表(我的表名是小写的),删掉自动创建的表后,又收到很多表和字段不存在的错误提示,冷静下来想一想—-我现在用的是Linux系统,区分大小写的,hbm配置文件中配置的表名、字段名都是大写的,自然hibernate不认我在数据库中创建的小写的表,当hibernate.hbm2ddl.auto=update时,就回创建新表。 解决办法:严格按照数据库设计规范,设计、创建符合规范的表名、字段名,在hbm文件中按照相同的规范编写映射文件;另外,为避免麻烦设置hibernate.hbm2ddl.auto=validate;这样如果有错就回报错或者查看日志文件,不用看到自动创建的表或字段了,毕竟一般的mis应用中,都是事先创建好表的,别让hibernate去凑热闹了。

题外2:iptables改完后,原来tomcat无法正常关闭的问题也得到了解决,估计是tomcat访问本机的8005端口时遭到了iptables的阻拦,tomcat等待8005端口的响应超时,导致停止服务失败;