jfinal 批量处理怎样使用?

codingjava 发布于 2016/01/18 16:36
阅读 1K+
收藏 0

@JFinal 你好,想跟你请教个问题:

bug

我的数据表明明没有数据,可是还是给我返回了成功,怎么回事的,那个sql不是这也使用的吗?可以指导一下吗?不太明白那个批量处理的具体怎么实现?

在好多jfianl问了这个问题,不过好像好多人只会使用单条删除操作,下次更新文档可以批量操作也加上去吗?

加载中
0
leaon_tan
leaon_tan

你将size[]输入到控制台看一下应该就明白了

size[]的长度应该和idArr[]一致,如果一条都没有成功的话,那么理论上来说size[]中所有的元素值都为0

0
c
codingjava

引用来自“_fong”的评论

你将size[]输入到控制台看一下应该就明白了

size[]的长度应该和idArr[]一致,如果一条都没有成功的话,那么理论上来说size[]中所有的元素值都为0

enen ,看了一下源代码,有点明白,只是奇怪这样的话,好难知道所有的都删除成功了,要遍历size的元素了
0
leaon_tan
leaon_tan
如果你的批量删除打算作为事务来处理的话,就建议逐条删除
0
龙影
龙影
为啥文字要用背景色?看着别扭啊。
0
c
codingjava

引用来自“龙影”的评论

为啥文字要用背景色?看着别扭啊。
怕你们没有留意到我的问题部分
龙影
龙影
@codingjava 你的完全可以使用一维数组啊,毕竟sql中才一个问号
c
codingjava
回复 @龙影 : 哈哈,好的那下次不再添加背景颜色了
龙影
龙影
我对颜色很敏感的,咋帮助你分析问题呢?^_^
0
c
codingjava

引用来自“_fong”的评论

如果你的批量删除打算作为事务来处理的话,就建议逐条删除
这也不好吧,消耗好大的那?
0
leaon_tan
leaon_tan

引用来自“_fong”的评论

如果你的批量删除打算作为事务来处理的话,就建议逐条删除

引用来自“codingjava”的评论

这也不好吧,消耗好大的那?

因为在事务中batch的话,会自动提交.

主要是batch方法中会每超过多少条就自动提交一次,如果条数很多的话就就会出现部分回滚的情况.

0
leaon_tan
leaon_tan

引用来自“_fong”的评论

你将size[]输入到控制台看一下应该就明白了

size[]的长度应该和idArr[]一致,如果一条都没有成功的话,那么理论上来说size[]中所有的元素值都为0

引用来自“codingjava”的评论

enen ,看了一下源代码,有点明白,只是奇怪这样的话,好难知道所有的都删除成功了,要遍历size的元素了
我也没发现更好的办法.
0
leaon_tan
leaon_tan

引用来自“_fong”的评论

如果你的批量删除打算作为事务来处理的话,就建议逐条删除

引用来自“codingjava”的评论

这也不好吧,消耗好大的那?

引用来自“_fong”的评论

因为在事务中batch的话,会自动提交.

主要是batch方法中会每超过多少条就自动提交一次,如果条数很多的话就就会出现部分回滚的情况.

这是DbPro.java中的batch方法处理方式,提交的方式主要跟batchSize有关


private int[] batch(Config config, Connection conn, String sql, Object[][] paras, int batchSize) throws SQLException {
		if (paras == null || paras.length == 0)
			throw new IllegalArgumentException("The paras array length must more than 0.");
		if (batchSize < 1)
			throw new IllegalArgumentException("The batchSize must more than 0.");
		int counter = 0;
		int pointer = 0;
		int[] result = new int[paras.length];
		PreparedStatement pst = conn.prepareStatement(sql);
		for (int i=0; i<paras.length; i++) {
			for (int j=0; j<paras[i].length; j++) {
				Object value = paras[i][j];
				if (config.dialect.isOracle() && value instanceof java.sql.Date)
					pst.setDate(j + 1, (java.sql.Date)value);
				else
					pst.setObject(j + 1, value);
			}
			pst.addBatch();
			if (++counter >= batchSize) {
				counter = 0;
				int[] r = pst.executeBatch();
				conn.commit();
				for (int k=0; k<r.length; k++)
					result[pointer++] = r[k];
			}
		}
		int[] r = pst.executeBatch();
		conn.commit();
		for (int k=0; k<r.length; k++)
			result[pointer++] = r[k];
		DbKit.closeQuietly(pst);
		return result;
	}

pst.executeBatch()效率应该是会比自己一行行提交会高一点,如果你不觉得麻烦的话.


0
返回顶部
顶部