qq_26595291 2015-10-28 15:33 采纳率: 66.7%
浏览 5680

web项目在执行大量的插入语句时执行一段时间后卡死

SSH框架,在页面有一个poi 批量导入excel的功能,每读取excel一行,保存为一个实体然后循环insert到DB里。刚开始程序运行正常,但是一段时间过后,系统出现卡死,不再执行insert sql ,刷新页面也没有响应,只能重启服务器。期间程序没有报错,myeclipse也不是内存溢出导致的卡死,因为点击其他功能模块时不会出现上述所说的问题,只有在执行大量的insert sql 时才会。
因为代码没有报错我也就不贴代码了。
我自己想的不知道是不是hibernate在做insert时由于数据量大导致链接关闭,但是我设置数据库连接池断开时间是1800s,事实上也没有超过。由于不知道hibernate底层的源码是怎样执行insert的,希望有大神说说,为什么在执行少量的insert时系统不会卡死,但处理大量数据并长时间insert的就是卡死。
虚心求各位指导!谢谢大家。如果有需要我会贴出代码。感谢。

更改过后的代码,但是又有新的问题

 @Override
    public void save(List<T> list) {
        long begin = System.currentTimeMillis(); 
        Session session = getSession();
        try {
            for (int i = 0; i < list.size(); i++) {
                session.save(list.get(i));
                if (i%50 == 0 && i != 0) {
                    session.flush();
                    session.clear();
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        finally{
            session.clear();
        }
        long end = System.currentTimeMillis(); 
        System.out.println((end-begin)/1000.0); 
    }

这是basedao,是spring管理hibernate,加了2个属性

 <prop key="hibernate.jdbc.fetch_size">100</prop>
<prop key="hibernate.jdbc.batch_size">50</prop>

方法是根据不同的实体批量insert,虽然现在执行大量insert时不会中断,但是我有4个实体要连续执行批量insert,在insert完前2个实体后,我在第三个实体调用批量导入的方法设了断点,程序并没有停在断点上,又出现了卡死的情况。PS:不知道是不是在insert第二个实体那里就卡死了,还是说执行完第二个批量insert就卡死了,反正我在第三个批量insert方法前断点没进,并且系统卡死,只能重启。

请大家不吝赐教!感谢!

  • 写回答

10条回答 默认 最新

  • Evankaka 博客专家认证 2015-10-28 15:44
    关注

    处理大量数据并长时间insert看看你是一条条插入的,还是批量插入的,这个在数据多时性能影响是很大的

    评论

报告相同问题?

悬赏问题

  • ¥15 paddleocr运行报错
  • ¥15 怎么用 matlab 设计滞后-超前串联校正网络
  • ¥15 MFC引用C#生成的dll,将dll放置到非exe程序目录,如何操作
  • ¥15 C#创建webservice接口,三方通过多次跳转访问本方服务,获取wsdl文档,wsdl中ip地址为局域网内本机地址而非三方直接访问的地址。
  • ¥15 关于#wireshark#的问题:需要安卓app流量数据集要安卓流量做包序列长度的实验,比如某些流量是在看视频还是在发评论
  • ¥15 Smail语句如何使用判断语句跳过验证卡密界面
  • ¥15 关于#wireshark#的问题:并且能够给数据做标注,如这个流量是在看视频或者是在转账
  • ¥15 运筹优化,gurobi,python
  • ¥20 springmvc重定向和返回json
  • ¥15 电脑键盘实现触摸功能