您的位置:首页 > 数据库

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然后一次提交到数据库,这样可以保证一次执行全部成功或者全部撤回
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  数据库 jdbc