首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > JAVA > J2EE开发 >

【求方向】hibernate 并发、批量插入数据,该怎么处理

2013-10-21 
【求方向】hibernate 并发、批量插入数据环境:数据库:本机:mysql 5.5.2集群 cluster版本7.2.5链接池:c3p0框架

【求方向】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();

   


    spring配置数据源


    


<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>

  
    



    请各位帮忙分析下在哪里会有问题。如何优化并发效率、以及该注意些什么、
    以及如何在优化我的批量保存效率、
    各位方便的话给个大体方向、我好知道从哪里下手、先谢谢各位、
[解决办法]
额...我只能说!这样不慢,就怪了
[解决办法]
外包公司,都出你这种人才?笑了!insert就这样,如果是批量Update操作,你岂不是要去死?
优化方案,
第一必然要优化sql语句
1,可以考虑2种方式:将所有sql语句,整合成一条!拼成一条插入sql语句...insert into table....(第一条数据,第二跳数据,第三条数据) 
2,使用executebath 批量插入 自己百度,开启事务,循环插入,事务提交

第二,干掉spring,这种性能优先的,必然JDBC,简单,粗暴,有效!spring映射浪费太多时间

第三,并发情况下,可以加入多线程,预先预留几个线程进行等待,根据并发数来设置
线程要做的就是,当用户进行批量操作的时候,交出操作数据库的dao!可以考虑单例工厂模式

------解决方案--------------------


MySql的JDBC连接的url中要加rewriteBatchedStatements参数,并保证5.1.13以上版本的驱动,才能实现高性能的批量插入。
例如:String connectionUrl="jdbc:mysql://192.168.1.100:3306/test?rewriteBatchedStatements=true"; 
还要保证mysql JDBC驱的版本。MySql的JDBC驱动的批量插入操作性能是很优秀的。
 
MySql JDBC 驱动版本号       插入10万条数据用时
5.0.8加了rewriteBatchedStatements参数,没有提高  17.4秒
5.1.7加了rewriteBatchedStatements参数,没有提高  17.4秒
5.1.13加了rewriteBatchedStatements参数,速度提高到1.6秒

参考
http://www.iteye.com/topic/770032
[解决办法]
MySql的JDBC连接的url中要加rewriteBatchedStatements参数,并保证5.1.13以上版本的驱动,才能实现高性能的批量插入。
例如:String connectionUrl="jdbc:mysql://192.168.1.100:3306/test?rewriteBatchedStatements=true"; 
还要保证mysql JDBC驱的版本。MySql的……

热点排行
Bad Request.