gpt4 book ai didi

java - executeBatch 不返回多个 ResultSet 是否有原因

转载 作者:行者123 更新时间:2023-11-29 10:56:57 28 4
gpt4 key购买 nike

我正在查看其他人编写的一些旧代码,并注意到如果他们使用批量更新而不是一次执行一个更新,性能可能会提高(我们目前在使用 > 发出保存时遇到一些滞后问题)我们正在编写的游戏有 150 名玩家)。

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

        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。有针对这个的解决方法吗?我需要获取由executeBatch 生成的ResultSet,以获取唯一标识符以及要作为值插入的inventoryitemid。

最佳答案

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

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

关于java - executeBatch 不返回多个 ResultSet 是否有原因,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42885951/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com