关于mybatis批量安插和传统的jdbc操作的比较
关于mybatis批量插入和传统的jdbc操作的比较
今天 在网站上看到了一篇博客,说的是mybatis批量插入的有一些问题,于是自己做了一个简单的demo,做了下测试
mybatis测试代码
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd"> <configuration> <typeAliases> <typeAlias type="com.mybatis.config.User" alias="User" /> </typeAliases>package com.mybatis.config; <environments default="development"> <environment id="development"> <transactionManager type="JDBC" /><!--事务管理驱动 --> <dataSource type="POOLED"><!-- 数据源配置 --> <property name="driver" value="com.mysql.jdbc.Driver" /> <property name="url" value="jdbc:mysql://localhost:3306/mybatistest?useUnicode=true&characterEncoding=UTF-8" /> <property name="username" value="root" /> <property name="password" value="123456" /> </dataSource> </environment> </environments> <mappers> <mapper resource="UserDaoMapper.xml"/> </mappers> </configuration> <?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <!-- mybatis 映射文件 --> <mapper namespace="com.mybatis.config.UserDao"> <cache readOnly="true" /> <insert id="insert" parameterType="User" > insert into user(username,password,comment) values(#{username},#{password},#{comment}) </insert> </mapper>
java测试代码:
package com.mybatis.config; import java.io.File; import java.io.FileInputStream; import java.util.Iterator; import java.util.List; import org.apache.ibatis.io.Resources; import org.apache.ibatis.session.ExecutorType; import org.apache.ibatis.session.SqlSession; import org.apache.ibatis.session.SqlSessionFactory; import org.apache.ibatis.session.SqlSessionFactoryBuilder; import org.apache.log4j.xml.DOMConfigurator; /** * mybatis测试 * @author CHENLEI * */ public class UserDaoTest { public static void main(String[]args){ try { userDaoTest(); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } } public static void userDaoTest() throws Exception { DOMConfigurator.configure("res/log4j.xml"); File file=Resources.getResourceAsFile("mybatisBase.xml"); SqlSessionFactoryBuilder Factorybuilder = new SqlSessionFactoryBuilder(); SqlSessionFactory factory=Factorybuilder.build(new FileInputStream(file)); SqlSession session1 = factory.openSession();//普通的操作 SqlSession session2 = factory.openSession(ExecutorType.BATCH, false);//是否自动提交事务 UserDao userDao1 = session1.getMapper(UserDao.class);// UserDao userDao2 = session2.getMapper(UserDao.class);// User user = new User(); user.setUsername("test"); user.setPassword("123456"); user.setComment("comment"); try{ long t1=System.currentTimeMillis(); for(int i=0;i<1000;i++){ userDao2.insert(user); } System.out.println(System.currentTimeMillis()-t1+"ms"); }finally{ // session1.commit(); // session1.close(); } } }
运行结果:(结果来自三次测试的结果,取的一个范围,因为外界因素,下同)
1000次:632---650ms
下面是传统的jdbc:
package com.mybatis.config; import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import java.sql.SQLException; public class commonjdbcBatch { /** * @param args * @throws SQLException */ public static void main(String[] args) throws SQLException { Connection con=null; PreparedStatement s=null; // TODO Auto-generated method stub try { Class.forName("com.mysql.jdbc.Driver"); con=DriverManager.getConnection("jdbc:mysql://localhost:3306/mybatistest?useUnicode=true&characterEncoding=UTF-8", "root","123456"); con.setAutoCommit(false);//不自动提交 s=con.prepareStatement(" insert into user(username,password,comment) values(?,?,?)"); long t1=System.currentTimeMillis(); for(int i=0;i<1000;i++){ s.setString(1,"clinux"+i); s.setString(2,"123456"); s.setString(3,"comment"); s.addBatch(); } s.executeBatch();
con.commit(); System.out.println(System.currentTimeMillis()-t1+"ms"); s.clearBatch(); } catch (ClassNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); }finally{ con.close(); s.close(); } } }
测试1000次结果:
1000次:308---330ms
所以从上面的测试我们可以看出mybatis的插入速度不及传统的jdbc,用此类框架我们主要是搞j2ee,虽然在性能上面不及,但是稳定,所以这也是一个要权衡的问题;传统的是快,但是用mybatis我们在一些方面上可以不用在造轮子,节约开发时间,当然对于mybatis的用的地方,需要我们在实际的项目中权衡了(或许我们只用mybatis的Mapper,连接池的话我们可以用其他的,譬如bonecp,c3p0),以上仅供研究学习。
1 楼
步青龙
2012-06-12
在数据量小的时候和数据量大的时候测试可能结果会反过来,不同的数据量,不同的xxx等,甚至相同的框架,相同的数据量在不同的时候,不同的机器都可能会不同
2 楼
季铵盐
2012-06-13
仅供参考,真正在项目中自己去权衡!