环境:
数据库:本机:mysql 5.5.2 集群 cluster版本7.2.5
链接池:c3p0
框架:S2SH
现有一批量保存的功能、条数在200条左右、单机测试是534ms左右
而发布到部署的集群环境中、200多条数据竟然等了1分钟、
并发人数最多50+人 (但都不是批量保存的动作、而是其他的正常动作)
监控数据库的时候 进程在20左右
我批量保存代码如下、
- Java code
SessionFactory sf = hibernateTemplate.getSessionFactory(); //session不是从事务中获取的、自己新创个、 Session session = sf.openSession(); session.getTransaction().begin(); long s = System.currentTimeMillis(); //循环保存、累积一起提交事务 time++ session.getTransaction().commit(); long e = System.currentTimeMillis(); System.out.println("共执行了"+time+"行数据用时:"+(e-s)+"ms"); session.flush(); session.clear(); session.close();
spring配置数据源
- XML code
<bean id="hibernateTemplate" class="org.springframework.orm.hibernate3.HibernateTemplate"> <property name="sessionFactory" ref="sessionFactory"/> <property name="cacheQueries" value="true"/> <property name="fetchSize" value="100"/> <property name="maxResults" value="10000"/> </bean> <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource" destroy-method="close"> <property name="driverClass"> <value>${c3p0.driverClass}</value> </property> <property name="jdbcUrl"> <value>${c3p0.jdbcUrl}</value> </property> <property name="user"> <value>${c3p0.user}</value> </property> <property name="password"> <value>${c3p0.password}</value> </property> <property name="minPoolSize"> <value>5</value> </property> <property name="maxPoolSize"> <value>50</value> </property> <property name="initialPoolSize"> <value>5</value> </property> <property name="maxIdleTime"> <value>10</value> </property> <!--最大连接数后一次取多少--> <property name="acquireIncrement"> <value>5</value> </property> <property name="acquireRetryAttempts"> <value>30</value> </property> <property name="acquireRetryDelay"> <value>1000</value> </property> <property name="testConnectionOnCheckin"> <value>true</value> </property> <property name="automaticTestTable"> <value>conn_test</value> </property> <property name="idleConnectionTestPeriod"> <value>60</value> </property> <property name="checkoutTimeout"> <value>100</value> </property> <property name="numHelperThreads"> <value>5</value> </property> <property name="breakAfterAcquireFailure"> <value>false</value> </property> </bean>