JDBC批量操作数据库数据的内存限制
2014-10-10 11:33
190 查看
最近在做移动商城的项目,其中一个模块是用数据库表来记录日志。
最近有同事反应,他的数据没记全后半部分给人家丢了。
咱这么正值的人,怎么能干这种事呢,不能够!!于是,俺自己测了一下果然是丢了
同事的数据大约有30几K,而我才给人家保留了16K左右的数据。。。。。名誉一下被毁了。
于是,决定要把丢失的数据找回来,不能让他们在外面飘荡。
这次的项目是移动指定的数据库sybase,第一次接触以前从来没用过,所以有很多方面不是很了解。咨询了sybase的售后支持,人家说我们没限制。
好吧,既然你们没限制,那就从我们这里查找问题吧。项目的结构是spring+ibatis+sybase srping负责注入、ibatis负责数据库操作,起初以为是它俩合作出的问题,于是抛开项目,自己写了一个demo用最原始操作数据库的方法向表里写数据,结果大于16k的数据全部都写进去了。这样就证明了sybase本身以及jdbc本身都是没有问题的。
第二步,添加ibatis再次测试通过,说明ibatis也没有问题。第三次,spring+ibatis+sybase居然也成功了!!!!看来之前的猜测都错了,冤枉了众兄弟。
那么,问题到底出在哪呢??返回项目查看源码,原来在操作库表的时候用到了批次。去掉事处及批次处理的代码再次测试,问题解决了
readWriteClient.startTransaction();
try {
readWriteClient.startBatch();
Map<String, Object> params =
new HashMap<String, Object>();
for (ProductProp
prop : propList) {
params.put("propertyId",
prop.getPropertyId());
params.put("productId",
prop.getProductId());
params.put("propertyValue",
prop.getPropertyValue());
readWriteClient.update("ProductProp.updatePropertyValue",
params);
}
readWriteClient.executeBatch();
readWriteClient.commitTransaction();
} finally {
try {
readWriteClient.endTransaction();
} catch (Exception
e) {
logger.error("endTransaction exception",
e);
}
}
总结:
jdbc操作数据库时,如果使用batch执行insert\update\delete时,字符串String最大长度为16kb 如果单独使用insert\update\delete时,没有该限制。
因为批理执行的原理,是将待提交的数据先暂时存在内存中,所以jdbc对单次内存做了限制,至于该限制能不能改?我的回答是:不知道
批次处理,其实就是把要提交的数据拼接成一个大的sql然后一次提交到数据库,这样可以保证一次执行全部成功或者全部撤回
最近有同事反应,他的数据没记全后半部分给人家丢了。
咱这么正值的人,怎么能干这种事呢,不能够!!于是,俺自己测了一下果然是丢了
同事的数据大约有30几K,而我才给人家保留了16K左右的数据。。。。。名誉一下被毁了。
于是,决定要把丢失的数据找回来,不能让他们在外面飘荡。
这次的项目是移动指定的数据库sybase,第一次接触以前从来没用过,所以有很多方面不是很了解。咨询了sybase的售后支持,人家说我们没限制。
好吧,既然你们没限制,那就从我们这里查找问题吧。项目的结构是spring+ibatis+sybase srping负责注入、ibatis负责数据库操作,起初以为是它俩合作出的问题,于是抛开项目,自己写了一个demo用最原始操作数据库的方法向表里写数据,结果大于16k的数据全部都写进去了。这样就证明了sybase本身以及jdbc本身都是没有问题的。
第二步,添加ibatis再次测试通过,说明ibatis也没有问题。第三次,spring+ibatis+sybase居然也成功了!!!!看来之前的猜测都错了,冤枉了众兄弟。
那么,问题到底出在哪呢??返回项目查看源码,原来在操作库表的时候用到了批次。去掉事处及批次处理的代码再次测试,问题解决了
readWriteClient.startTransaction();
try {
readWriteClient.startBatch();
Map<String, Object> params =
new HashMap<String, Object>();
for (ProductProp
prop : propList) {
params.put("propertyId",
prop.getPropertyId());
params.put("productId",
prop.getProductId());
params.put("propertyValue",
prop.getPropertyValue());
readWriteClient.update("ProductProp.updatePropertyValue",
params);
}
readWriteClient.executeBatch();
readWriteClient.commitTransaction();
} finally {
try {
readWriteClient.endTransaction();
} catch (Exception
e) {
logger.error("endTransaction exception",
e);
}
}
总结:
jdbc操作数据库时,如果使用batch执行insert\update\delete时,字符串String最大长度为16kb 如果单独使用insert\update\delete时,没有该限制。
因为批理执行的原理,是将待提交的数据先暂时存在内存中,所以jdbc对单次内存做了限制,至于该限制能不能改?我的回答是:不知道
批次处理,其实就是把要提交的数据拼接成一个大的sql然后一次提交到数据库,这样可以保证一次执行全部成功或者全部撤回
相关文章推荐
- JDBC操作Vertica数据库,用PreparedStatements对象实现批量插入数据
- c#批量插入数据到数据库【支持事务操作】
- 使用回调函数来实现jdbc操作数据库数据
- 数据库操作--批量修改数据库表名及字段名大小写转换及首字母大写+删除没有数据无用的表
- JDBC 数据库连接 创建表格、插入、查询、删除、修改数据 基本操作
- JDBC操作数据库之查询数据
- 简单的jdbc操作数据库例子,高效率插入数据
- (转)JSP数据库操作例程 - 数据分页显示 - JDBC 2.0 - Oracle
- Android 数据库批量查询数据的操作
- hibernate的update及JDBC数据库批量操作
- JDBC 批量添加数据到数据库
- Java在数据库操作中批量插入数据
- Java操作Excel(三)将Excel中的数据批量的导入数据库
- 通过jdbc实现对数据库中数据的增删查改操作
- JDBC中针对数据的批量操作
- JAVA+JDBC对数据库的数据进行增加、修改、删除、查询等操作
- jdbc 连接数据库、批量操作、事务(oracle、mysql)
- JDBC之数据库的增,删,改,查, 搜, 批量执行,获取表结构,获取某一用户下所有的表,滚轴操作的封装
- sql 数据库批量操作数据-开始事件
- JDBC中Statement操作数据库 添加数据