发表于: 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高效插入数据的方法,体验到了数据库的性能。
评论