关于mybatis批量提交数据

lingjiaju 2012-11-18 10:44:32
我用spring3.1整合了mybatis3.1,现在碰到个问题,不知道怎样打开mybatis的批量提交。
配置文件如下:
<!-- MyBatis配置 -->
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="dataSource" />
<property name="typeAliasesPackage" value="com.my.home.data.vo" />
</bean>
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<property name="basePackage" value="com.my.home.data.mapper" />
</bean>
定义了包com.my.home.data.mapper,然后包里面写接口,但不用实现,把mapper文件一起放同个包下,service调用的时候直接调用接口的方法就可以了,所以不用获取连接,连接是自动获取的。那么这里问题就来了,不需要获取连接,直接调用接口的方法就OK了,那就无法更改提交方式,请指教,这种使用自动代理的方式,怎么修改提交方式?假如我有100W的数据需要写入,性能就很低下了。
比如我写了个DAO的接口UserMapper,里面有个insertbatch方法,那么我写个mapper,里面定义好insertbatch的sql就OK了,service层直接调用userMapper.insertBatch(user),user为表的映射,不需要写接口的实现类,请问这种方法怎么修改sql提交的方式为batch?
...全文
4409 20 打赏 收藏 转发到动态 举报
写回复
用AI写文章
20 条回复
切换为时间正序
请发表友善的回复…
发表回复
悲剧的人参 2013-09-02
  • 打赏
  • 举报
回复
spring 编程式事务(PlatformTransactionManager ),可以自己去找相关资料
nongzhenqin 2013-08-28
  • 打赏
  • 举报
回复
引用 1 楼 peng_hao1988 的回复:
IBatis不是很熟,关于批量添加个人觉得还是对单条插入做循环比较好。 帮顶!!!!
一般一次提交50~100条比较好吧。
MiceRice 2013-08-07
  • 打赏
  • 举报
回复
MyBatis支持批量插入操作,类似:

<insert id="addTrainRecordBatch" useGeneratedKeys="true" parameterType="java.util.List">  
    <selectKey resultType="long" keyProperty="id" order="AFTER">  
        SELECT  
        LAST_INSERT_ID()  
    </selectKey>  
    insert into t_train_record (add_time,emp_id,activity_id,flag)   
    values  
    <foreach collection="list" item="item" index="index" separator="," >  
        (#{item.addTime},#{item.empId},#{item.activityId},#{item.flag})  
    </foreach>  
</insert>  
具体可以Google样例。
小丑哥_V5 2013-08-07
  • 打赏
  • 举报
回复
感觉mybatis的批量插入xml定义不太靠谱,小的还可以...大的就算了吧... 我都是自己另开jdbctemplate底层,然后注入数据源,用jdbc的批处理随便折腾
u011015219 2013-08-07
  • 打赏
  • 举报
回复
引用 14 楼 u010890009 的回复:
建议楼主看下mybatis-spring的文档,里面有个SqlSessionTemplate,估计可以满足你的需求 <bean id="sqlSession" class="org.mybatis.spring.SqlSessionTemplate"> <constructor-arg index="0" ref="sqlSessionFactory" /> <constructor-arg index="1" value="BATCH" /> </bean>
我加上了这句,但是没有任何作用,现在的问题是:第一次批插入1W多点数据耗时130多秒,第二次第三次...都是三四秒左右;每次重启后第一次批插入都很慢,耗时基本在130多秒;求解!
人心莫测 2013-08-07
  • 打赏
  • 举报
回复
建议楼主看下mybatis-spring的文档,里面有个SqlSessionTemplate,估计可以满足你的需求 <bean id="sqlSession" class="org.mybatis.spring.SqlSessionTemplate"> <constructor-arg index="0" ref="sqlSessionFactory" /> <constructor-arg index="1" value="BATCH" /> </bean>
人心莫测 2013-08-07
  • 打赏
  • 举报
回复
@Service
public class TestService implements ITestService
{

	public static void main(String[] args)
	{
		ApplicationContext context = new ClassPathXmlApplicationContext(
				"applicationContext.xml");

		ITestService testService = context.getBean(ITestService.class);

		testService.test(0, "");
	}

	@Resource(name = "sqlSession")
	SqlSession sqlSession;

	@Transactional(propagation = Propagation.REQUIRES_NEW)
	public void test(int userId, String ip)
	{
		// TODO Auto-generated method stub
		long now = System.currentTimeMillis();
		ITestDao testDao = this.sqlSession.getMapper(ITestDao.class);
		for (int id = 1; id < 10001; id++)
		{
			String name = "name_" + id;
			Test test = new Test(id, name);
			testDao.add(test);
		}
		System.out.println(System.currentTimeMillis() - now);
	}

}
如果你的方法是A,有B调用A的话,A和B的ExecutorType是要相同,不同的话A方法需要开启一个新的事务
u011015219 2013-08-06
  • 打赏
  • 举报
回复
老兄,解决没有,求解决办法。。。。。
  • 打赏
  • 举报
回复
http://hekuilove.iteye.com/admin/blogs/1470895
星辰小屁孩 2013-01-17
  • 打赏
  • 举报
回复
ibitas 很蛋疼的事情啊
guxiaoli1990 2013-01-11
  • 打赏
  • 举报
回复
同求,同求!!
tangwei070 2013-01-11
  • 打赏
  • 举报
回复
不如直接jdbc提交 ?
xuhesheng 2012-12-07
  • 打赏
  • 举报
回复
兄台,我也在用mysql+spring3+mybatis3的组合中 但是我遇到了一个问题 比如说 在一个insert或者update或者delete的节点下 情况1:在处理第一张表的sql语句后还跟着一个处理另外一张表的句子 情况2:处理同一张表,但是分别执行insert和update等DML语句的组合 这两种情况都在框架下报错 但是单独在mysql中执行是正确的 我想知道你有没遇到这样的问题? 然后又是怎么解决的? 可以到 http://bbs.csdn.net/topics/390305603 查看我前几天发布的帖子
  • 打赏
  • 举报
回复
mybatis配置sql的xml语法太垃圾了
torytin 2012-12-04
  • 打赏
  • 举报
回复
session = sqlSessionFactory.openSession(ExecutorType.BATCH, false); AccountMapper accountMapper = session.getMapper(AccountMapper.class); …… for (……) { …… } session.commit();
lingjiaju 2012-12-04
  • 打赏
  • 举报
回复
引用 1 楼 peng_hao1988 的回复:
IBatis不是很熟,关于批量添加个人觉得还是对单条插入做循环比较好。 帮顶!!!!
单条去循环是很不现实的,必须用批量提交的方式,比如我有几百万甚至1000W的数据需要插入临时表,然后拿插入的数据去做数据校验,OK的数据就插入,直接挪表。这个时候一条条的循环插入,你觉得需要多久?我做个简单的测试,3个字段的垃圾数据,1000W条,我插入mysql只需要5分钟,你有没有试过一条条循环插入要多久? 其实批量我已经实现了,我只是想知道我不写DAO实现类,看是否可以通过配置或者注解的方式修改sql提交模式,因为我现在的DAO都只有接口,没有实现类的,为了批量提交,我单独写了实现类。
lingjiaju 2012-12-03
  • 打赏
  • 举报
回复
引用 2 楼 hanyunihao 的回复:
<insert id="insertPedometerRecordByHNew" parameterType="list"> insert into t_ihealth_pedometer_hour (user_id,device_code,step,distance,floor,calorie,start_time,end_time,max_end_time) ……
这个我知道,是把多条sql拼接成一条sql去执行,但是数据库会每次接收的数据包有个限制的,所以这个对于大批量的数据是不行的,必须采用batch提交的方式。比如我用mysql做实验,mysql默认的每次接收的数据包最大限制是8M,如果1000W的数据插入,需要把限额改成50M,但是我用batch模式做批量提交,8M也可以搞定。 我现在是想看怎么不写DAO实现类的方式,看有没有通过配置或者注解的方式修改sql执行模式,如果需要写DAO实现类去修改batch模式我已经是实现了的。
hanyunihao 2012-11-22
  • 打赏
  • 举报
回复
<insert id="insertPedometerRecordByHNew" parameterType="list"> insert into t_ihealth_pedometer_hour (user_id,device_code,step,distance,floor,calorie,start_time,end_time,max_end_time) select * from ( <foreach collection="list" item="item" index="index" separator="union all"> select #{item.userId},#{item.deviceCode},#{item.step},#{item.distance},#{item.floor},#{item.calorie},#{item.startTime},#{item.endTime},#{item.maxEndTime} from dual </foreach> ) </insert> 参数接收一个list集合,用到了 oracle的union all 语句!
桃园闲人 2012-11-21
  • 打赏
  • 举报
回复
IBatis不是很熟,关于批量添加个人觉得还是对单条插入做循环比较好。 帮顶!!!!

25,980

社区成员

发帖
与我相关
我的任务
社区描述
高性能WEB开发
社区管理员
  • 高性能WEB开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧