【求方向】hibernate 并发、批量插入数据
环境:
数据库:本机:mysql 5.5.2 集群 cluster版本7.2.5
链接池:c3p0
框架:S2SH
现有一批量保存的功能、条数在200条左右、单机测试是534ms左右
而发布到部署的集群环境中、200多条数据竟然等了1分钟、
并发人数最多50+人 (但都不是批量保存的动作、而是其他的正常动作)
监控数据库的时候 进程在20左右
我批量保存代码如下、
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();
<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>