我正在阅读别人写的一些旧代码,并注意到如果他们使用批量更新而不是一次执行一个更新,性能可能会提高(我们目前在发布保存时遇到一些延迟问题我们正在编写的游戏中包含> 150名玩家。
然而,问题是我需要从批处理中获取ResultSet,但它只返回一个。
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 相关。但是,我们还希望存储有关Equipment的信息,该信息从Item类扩展而来。首先,我提高速度的解决方案是批量执行inventoryitems,然后批量执行inventoryequipment。但问题是executeBatch()只返回一个ResultSet。这个问题有方法解决吗?我需要获取executeBatch生成的ResultSet以获取唯一标识符以及inventoryitemid作为值插入。
答案 0 :(得分:1)
执行批处理的返回类型是int数组,其中包含语句的更新计数。
请参阅此处https://docs.oracle.com/javase/7/docs/api/java/sql/Statement.html