发表于: 2017-12-21 21:56:42

1 650


今日完成

1,根据师兄的指导,了解到了数据库操作的大多数时间耗费在数据库连接打开和关闭上

因此将代码修改为

@Test
public void testAdd()
{

SqlSession sqlSession = null;
   try {
       sqlSession = MyBatisUtil.getSqlSession(false);//false为不自动提交事务
       String statement = "com.jnshu.mapping.userMapper.addUser";
       User user = new User();
       long start = System.currentTimeMillis();
       for (int x=0;x<1;x++){
              for (int y=0;y<10000;y++){
               user.setId(y+1);
               user.setName("李四——"+(y+1));
               user.setNum(y+1);
               //执行插入操作
      sqlSession.insert(statement,user);
               //手动提交事务
      sqlSession.commit();
               System.out.println("id="+user.getId());
           }
      }
long end = System.currentTimeMillis();
System.out.println("OK,用时::" + (end - start) + "ms");

   } catch (Exception e) {
e.printStackTrace();
   } finally {
//使用SqlSession执行完SQL之后需要关闭SqlSession
       sqlSession.close();
   }
}

执行结果:

相比昨天的  确实快了很多,但是看了下师兄的日报,好像我的事务提交位置放错了(我放到了循环语句内),应该是执行了1W条sql语句后,在提交事务,即

for (int x=0;x<1;x++){
      for (int y=0;y<10000;y++){
       user.setId(y+1);
       user.setName("李四——"+(y+1));
       user.setNum(y+1);

       //执行插入操作
   sqlSession.insert(statement,user);
       System.out.println("id="+user.getId());
   }
}
//手动提交事务
sqlSession.commit();

执行结果:11秒

2,然后在网上看到,mybatis可以实现批量插入,速度是真滴快!!!

首先修改userMapper.xml文件中addUser属性

<!-- 批量插入user表中 -->
<insert id="addUser" parameterType="User">
   insert into config_tb (id,name,num)
values
<foreach collection="list" item="item" index="index" separator=",">
       (#{item.id},#{item.name},#{item.num})
</foreach>
</insert>

然后将代码修改为

@Test
public void testAdd()
{
SqlSession sqlSession = null;
   try {
       sqlSession = MyBatisUtil.getSqlSession(false);
       String statement = "com.jnshu.mapping.userMapper.addUser";
       List<User> userList=new ArrayList<User>();
       long start = System.currentTimeMillis();
       for (int x=0;x<1;x++){
             for (int y=0;y<10000;y++){
               User user = new User();
               user.setId(y+1);
               user.setName("test__"+(y+1));
               user.setNum(y+1);

               userList.add(user);//将user放在List集合中!!
               System.out.println("id="+user.getId());
             }
       }
        //执行插入操作
       sqlSession.insert(statement,userList);
       //手动提交事务
       sqlSession.commit();
       long end = System.currentTimeMillis();
       System.out.println("OK,用时::" + (end - start) + "ms");

   } catch (Exception e) {
e.printStackTrace();
   } finally {
       sqlSession.close();
   }
}

测试结果:插入1W条数据用时,仅仅用了2秒8


但是当我插入100W条数据时,报错

网上查询,原因是MySQL的max_allowed_packet设置过小引起的

mysql根据配置文件会限制server接受的数据包大小。

有时候大的插入和更新会被max_allowed_packet 参数限制掉,导致失败。
在mysql命令行中执行命令

1.查看当前配置

show VARIABLES like '%max_allowed_packet%';

2.修改配置

set global max_allowed_packet = 2*1024*1024*100;

但是不知道为什么,重启MySQL后,还是没有设置成功


然后将MySQL安装包下的my.ini文件,在[mysqld]段下面加上

max_allowed_packet=20M

重启服务,修改成功


插入十万,无索引:     有索引:


遇到的疑惑

以上


明日计划

接着任务做

收获

学习了几种提高mybatis+MySQL高效插入数据的方法,体验到了数据库的性能。


返回列表 返回列表
评论

    分享到