用Tomcat+Mysql+Spring+Hibernate作了一个小应用,结果投入使用的时候,发现每过一天,就必须重启动Tomcat,我跟踪Tomcat日志,发现是Mysql连接被拒绝
尝试了N种方法,换为Tomcat的连接池连接,调整Jdbc连接串的参数,加入C0p3连接池参数多种方法.
最后发现必须几种处理方式都加上,才能够正常的处理
1.改用Tomcat连接池连接
<Resource name="jdbc/oapool" auth="Container" type="javax.sql.DataSource" />
<ResourceParams name="jdbc/oapool" >
<parameter>
<name>factory</name>
<value>org.apache.commons.dbcp.BasicDataSourceFactory</value>
</parameter>
<parameter>
<name>removeAbandoned</name>
<value>true</value>
</parameter>
<parameter>
<name>removeAbandonedTimeout</name>
<value>0</value>
</parameter>
<parameter>
<name>logAbandoned</name>
<value>false</value>
</parameter>
<parameter>
<name>maxActive</name>
<value>10</value>
</parameter>
<parameter>
<name>maxIdle</name>
<value>5</value>
</parameter>
<parameter>
<name>maxWait</name>
<value>1800</value>
</parameter>
<parameter>
<name>username</name>
<value>admin</value>
</parameter>
<parameter>
<name>password</name>
<value>123</value>
</parameter>
<parameter>
<name>driverClassName</name>
<value>com.mysql.jdbc.Driver</value>
</parameter>
<parameter>
<name>url</name>
<value>jdbc:mysql://localhost:3306/oa?useUnicode=true&characterEncoding=GB2312</value>
</parameter>
</ResourceParams>
2.在JDBC连接串中加入AutoReconnect=True
3.在Hibernate配置文件中加入C0p3连接池参数
<property name="c3p0.min_size">5</property>
<property name="c3p0.max_size">30</property>
<property name="c3p0.time_out">0</property>
<property name="c3p0.max_statement">50</property>
<property name="c3p0.acquire_increment">1</property>
<property name="c3p0.idle_test_period">0</property>
<property name="c3p0.validate">true</property>
4.在MySQL.ini文件中,加入Wait-Time参数
wait-timeout =2400
全部处理后,终于完全正常了,连之前,反复请求,就出现异常的情况也没有了
相对来说,还是商业数据库要好点,就算最差的MSSQL也没有这类问题,更别说DB2,Oracle了
当然,成本的降低意味这要更费精力,这也很正常.....
另外Tomcat刷出的动态 JSP页面里面,特别是没用装饰器的情况
如果页面内部有中文时,往往只显示了部分的页面到客户端
开始采用的办法是,往页面里面加入一些空格,空格数量保证大于 中文数字*2就可以了
后来研究发现,使用SiteMesh装饰器就可以解决这个问题,建立一个装饰器,里面不要直接有中文,中文用fmt标签代替.
再在所有的页面里面套个装饰器,就可以正常输出了,估计Tomcat在向客户端返回是会计算需要的缓冲区,而中文可能是6个字节的,Tomcat在某些情况下认为是4个字节,所以每个中文少两个字节
而使用装饰器后,组合输出的过程可能有装饰器进行了某种处理,保证头尾都是装饰的内容,中文的部分也就是我们的页面的缓冲计算也不由Tomcat管理了
其实,这个问题,很可能就是装饰器造成的,不用装饰器的应用,好像没处这个问题
应该是,SiteMesh 设置的包装页,用的编码是 UTF-8,其字符计数是6个字节一个字符,而内部的内容页,可能用的ANSI(GBK)做的内容页,其字符计数是4个字节一个字符,这样其想客户端输出时,Servlet按包装也的UTF-8编码的字符计数方法,计算了内容页的内容,所以总字数就少了接近1/3,比较了缺少的字符数,从侧面说明了这一点
如果SITEMESH 包装页 和内容页编码一致,这个问题就不会出现了
还有一种可能的情况,就是INCLUDE JSP页面的 pageEncoding 参数指定得不一致
这在Weblogic里面基本不会出现,它不允许出现多个@Page,只会在Tomcat下发生
解决的方法:
1.将页面的 pageEncoding改成一致的
2.使用 <jsp:include 代替 inlcude