关于Tomcat连接数据库,连续刷洗就挂掉的问题,高手请进。

一团小毛线 2014-03-13 04:46:35
平台是Tomcat+Mysql,程序用的是spring+hibernate+struts2,数据连接池用的c3p0。
出现的症状是,只要连续刷新,用浏览器长按F5,10来秒后,不能访问连接数据库的页面了,但是静态页能访问,说明tomcat是没有挂掉的,只是连接数据库不能连接了。查了很多网上关于这方面的问题,一些说是Tomcat的最大线程数或者Tomcat最大内存太小,只有一个浏览器访问的情况下,连续F5,应该不至于导致Tomcat连接数据库有问题吧,那不是很容易就被人家黑掉?一部分人则说是连接数据库没有释放,但是用的是c3p0,应该不存在不释放的问题啊。

高手还请指点啊,谢谢。

具体的配置文件如下:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:jaxws="http://cxf.apache.org/jaxws"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd">
<!-- <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource" destroy-method="close"> -->
<!-- <property name="driverClassName" value="com.mysql.jdbc.Driver"/> -->
<!-- <property name="url" value="jdbc:mysql://192.168.1.104/nhdz"/> -->
<!-- <property name="user" value="root"/> -->
<!-- <property name="password" value="mysql123"/> -->
<!-- <property name="maxPoolSize" value="30"/> -->
<!-- <property name="minPoolSize" value="1"/> -->
<!-- <property name="initialPoolSize" value="1"/> -->
<!-- <property name="maxIdleTime" value="20"/> -->
<!-- </bean> -->
<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource" destroy-method="close">
<property name="driverClass">
<value>com.mysql.jdbc.Driver</value>
</property>
<property name="jdbcUrl">
<value>jdbc:mysql://61.145.120.110/nz</value>
<!-- jdbc:mysql://localhost:3306/DBName?useUnicode=true&characterEncoding=GBK -->
</property>
<property name="preferredTestQuery" value="select 1" />
<property name="testConnectionOnCheckin" value="true" />
<!--MySQL数据库的用户名 -->
<property name="user">
<value>root</value>
</property>
<!--MySQL数据库 密码 -->
<property name="password">
<value>888</value>
</property>
<!--连接池中保留的最小连接数。-->
<property name="minPoolSize">
<value>5</value>
</property>
<!--连接池中保留的最大连接数。Default: 15 -->
<property name="maxPoolSize">
<value>100</value>
</property>
<!--初始化时获取的连接数,取值应在minPoolSize与maxPoolSize之间。Default: 3 -->
<property name="initialPoolSize">
<value>10</value>
</property>
<!--最大空闲时间,多少秒内未使用则连接被丢弃。若为0则永不丢弃。Default: 0 -->
<property name="maxIdleTime">
<value>90</value>
</property>
<!--当连接池中的连接耗尽的时候c3p0一次同时获取的连接数。Default: 3 -->
<property name="acquireIncrement">
<value>5</value>
</property>
<!--JDBC的标准参数,用以控制数据源内加载的PreparedStatements数量。但由于预缓存的 statements属于单个connection而不是整个连接池。所以设置这个参数需要考虑到多方面 的因素。如果maxStatements与maxStatementsPerConnection均为0,则缓存被关闭。Default: 0-->
<property name="maxStatements">
<value>0</value>
</property>
<!--每60秒检查所有连接池中的空闲连接。Default: 0 -->
<property name="idleConnectionTestPeriod">
<value>60</value>
</property>
<!--定义在从数据库获取新连接失败后重复尝试的次数。Default: 30 -->
<property name="acquireRetryAttempts">
<value>30</value>
</property>
<!--获取连接失败将会引起所有等待连接池来获取连接的线程抛出异常。但是数据源仍有效
保留,并在下次调用getConnection()的时候继续尝试获取连接。如果设为true,那么在尝试
获取连接失败后该数据源将申明已断开并永久关闭。Default: false-->
<property name="breakAfterAcquireFailure">
<value>true</value>
</property>
<!--因性能消耗大请只在需要的时候使用它。如果设为true那么在每个connection提交的
时候都将校验其有效性。建议使用idleConnectionTestPeriod或automaticTestTable
等方法来提升连接测试的性能。Default: false -->
<property name="testConnectionOnCheckout">
<value>true</value>
</property>
</bean>
<bean id="sessionFactory" class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">
<property name="dataSource">
<ref bean="dataSource" />
</property>
<property name="mappingResources">
<list>
<value>tn/dz/domain/DZ.hbm.xml</value>
</list>
</property>
<property name="hibernateProperties">
<props>
<prop key="hibernate.dialect">org.hibernate.dialect.MySQLDialect</prop>
<prop key="hibernate.show_sql">true</prop>
<prop key="hibernate.hbm2ddl.auto">update</prop>
<prop key="hibernate.format_sql">true</prop>
<prop key="hibernate.cache.use_second_level_cache">true</prop>
<prop key="hibernate.cache.provider_class">org.hibernate.cache.EhCacheProvider</prop>
<prop key="hibernate.autoReconnect">true</prop>
</props>
</property>
</bean>

<import resource="classpath:actionContext.xml"/>
<import resource="classpath:daoContext.xml"/>
<!-- <bean id="DZDao" class="tn.nhdz.dao.impl.DZDaoImpl" > -->
<!-- <property name="sessionFactory"> -->
<!-- <ref bean="sessionFactory" /> -->
<!-- </property> -->
<!-- </bean> -->
</beans>
...全文
226 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
一团小毛线 2014-03-14
  • 打赏
  • 举报
回复
就没人帮帮我吗...求高手出现,困扰已久。
一团小毛线 2014-03-13
  • 打赏
  • 举报
回复
附上查询数据库的方法,高手指点一下,谢谢。 @Override public List<DZ> findAll(String hql,int start,int count,String type) { // TODO 自动生成的方法存根 Session session = sessionFactory.openSession(); Transaction tx = null; List<DZ> dzs=new ArrayList<DZ>(); // List<DZ> dzs=new ArrayList<DZ>(); try { tx = session.beginTransaction(); Query query=session.createQuery(hql); query.setString(0, type); query.setFirstResult(start); query.setMaxResults(count); dzs=query.list(); tx.commit(); session.close(); } catch (HibernateException e) { if(tx != null){ tx.rollback(); } //return false; e.printStackTrace(); }
一团小毛线 2014-03-13
  • 打赏
  • 举报
回复
引用 1 楼 defonds 的回复:
1. 看看 db 服务器负载情况,特别是 CPU、内存; 2. 用工具比如 JProfiler 看看你的代码情况,特别是内存利用; 3. 检查连接释放情况。
你好,首先谢谢你的回复。 1、服务器CPU、内存消耗过大的问题是不存在的,我连局域网内另外一台只装了mysql的机器试过,也还是这种情况,只要连续连接,就出问题。 2、这个工具没用过,惭愧啊,立马去看看怎么用。 3、用的是c3p0数据库连接池做的连接,我认为不存在释放的问题。如果存在,应该怎么检查呢?谢谢
Defonds 2014-03-13
  • 打赏
  • 举报
回复
1. 看看 db 服务器负载情况,特别是 CPU、内存; 2. 用工具比如 JProfiler 看看你的代码情况,特别是内存利用; 3. 检查连接释放情况。

81,091

社区成员

发帖
与我相关
我的任务
社区描述
Java Web 开发
社区管理员
  • Web 开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧