首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么executeBatch不返回多个ResultSets?

为什么executeBatch不返回多个ResultSets?
EN

Stack Overflow用户
提问于 2017-03-19 11:21:15
回答 1查看 733关注 0票数 0

我正在研究其他人编写的一些旧代码,并注意到如果他们使用批处理更新而不是一次执行一个更新(我们正在编写的游戏中发出超过150个玩家的保存时出现了一些滞后问题),性能可能会提高。

但是,问题是我需要从批处理中获取ResultSets,但它只返回一个。

代码语言:javascript
复制
        try (PreparedStatement ps = con.prepareStatement("INSERT INTO `inventoryitems` VALUES (DEFAULT, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)",
             Statement.RETURN_GENERATED_KEYS);
             PreparedStatement pse = con.prepareStatement(
             "INSERT INTO `inventoryequipment` VALUES (DEFAULT, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)")) {

            HashMap<Integer, List<Equip>> equips = new HashMap<Integer, List<Equip>>();

            if (!items.isEmpty()) {
                for (Pair<Item, MapleInventoryType> pair : items) {
                    Item item = pair.getLeft();
                    if (item.disappearsAtLogout())
                        continue;
                    MapleInventoryType mit = pair.getRight();
                    ps.setInt(1, value);
                    ps.setString(2, account ? null : String.valueOf(id));
                    ps.setString(3, account ? String.valueOf(id) : null);
                    ps.setInt(4, item.getItemId());
                    ps.setInt(5, mit.getType());
                    ps.setInt(6, item.getPosition());
                    ps.setInt(7, item.getQuantity());
                    ps.setString(8, item.getOwner());
                    ps.setInt(9, item.getPetId());
                    ps.setInt(10, item.getFlag());
                    ps.setLong(11, item.getExpiration());
                    ps.setString(12, item.getGiftFrom());
                    ps.addBatch();

                    if (item instanceof Equip) {
                        if (!equips.containsKey(item.getItemId()))
                            equips.put(item.getItemId(), new ArrayList<Equip>());
                        equips.get(item.getItemId()).add((Equip) item);
                    }
                }
                ps.executeBatch();

                try (ResultSet rs = ps.getGeneratedKeys()) {
                    while (rs.next()) {
                        MapleInventoryType mit = MapleInventoryType.getByType((byte) rs.getInt(5));
                        if (mit.equals(MapleInventoryType.EQUIP) || mit.equals(MapleInventoryType.EQUIPPED)) {
                            Equip equip = equips.get(rs.getInt(4)).get(0);
                            pse.setInt(1, rs.getInt(1));
                            pse.setInt(2, equip.getUpgradeSlots());
                            pse.setInt(3, equip.getLevel());
                            pse.setInt(4, equip.getStr());
                            pse.setInt(5, equip.getDex());
                            pse.setInt(6, equip.getInt());
                            pse.setInt(7, equip.getLuk());
                            pse.setInt(8, equip.getHp());
                            pse.setInt(9, equip.getMp());
                            pse.setInt(10, equip.getWatk());
                            pse.setInt(11, equip.getMatk());
                            pse.setInt(12, equip.getWdef());
                            pse.setInt(13, equip.getMdef());
                            pse.setInt(14, equip.getAcc());
                            pse.setInt(15, equip.getAvoid());
                            pse.setInt(16, equip.getHands());
                            pse.setInt(17, equip.getSpeed());
                            pse.setInt(18, equip.getJump());
                            pse.setInt(19, 0);
                            pse.setInt(20, equip.getVicious());
                            pse.setInt(21, equip.getItemLevel());
                            pse.setInt(22, equip.getItemExp());
                            pse.setInt(23, equip.getRingId());
                            equips.get(rs.getInt(4)).remove(0);
                            pse.addBatch();

                        }
                    }
                    pse.executeBatch();
                }
            }
        }

基本上,您可以避免的是,第一次将库存项添加到数据库中。此批与表inventoryitems.有关。但是,我们也希望存储有关设备的信息,这是从Item类扩展的。首先,我提高速度的解决方案是批量执行库存物品,然后批量执行库存设备。但是,问题是executeBatch()只返回一个ResultSet。有解决办法吗?我需要获取由ResultSets生成的executeBatch,以获取唯一的标识符以及要作为值插入的清单列表。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-03-19 12:16:19

执行批处理的返回类型是int数组,它包含语句的更新计数。

请参阅此处https://docs.oracle.com/javase/7/docs/api/java/sql/Statement.html

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42885951

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档