资源泄漏:'rset' 未在此位置关闭
Resource Leak: 'rset' is not closed at this location
所以我正在做一个项目,但我不确定如何处理这个错误或如何修复它。我已经尝试了我能想到的一切,也许其他人对如何修复它有一些意见。它以 java 编码,用于游戏。错误是 Resource leak: 'rset' is not closed at this location。它挑出的是这一行。
rset = statement.executeQuery("SELECT * FROM `items` WHERE `owner_id` = " + objectId + " AND `location` = " + ItemLocation.EQUIPMENT.ordinal());
希望有人对如何修复此错误有一些意见,我应该取消警告,它会导致内存泄漏或影响程序的性能吗?
public final PlayerPreview restorePreview(int objectId) {
Connection con = null;
PreparedStatement statement = null;
ResultSet rset = null;
try {
con = connectFactory.getConnection();
statement = con.prepareStatement(SELECT_PLAYER_PREVIEW);
statement.setInt(1, objectId);
rset = statement.executeQuery();
if(!rset.next()) {
LOGGER.warning("not found player for " + objectId);
return null;
}
PlayerPreview playerPreview = PlayerPreview.newInstance(objectId);
playerPreview.setSex(rset.getByte("sex"));
playerPreview.setRaceId(rset.getByte("race_id"));
playerPreview.setClassId(rset.getByte("class_id"));
playerPreview.setLevel(rset.getByte("level"));
playerPreview.setOnlineTime(rset.getLong("online_time"));
playerPreview.setName(rset.getString("char_name"));
PlayerAppearance appearance = loadPlayerAppearance(objectId);
if(appearance == null)
return null;
Equipment equipment = PlayerEquipment.newInstance(null);
ItemTable itemTable = ItemTable.getInstance();
{
rset = statement.executeQuery("SELECT * FROM `items` WHERE `owner_id` = " + objectId + " AND `location` = " + ItemLocation.EQUIPMENT.ordinal());
while(rset.next()) {
ItemTemplate template = itemTable.getItem(rset.getInt("item_id"));
if(template == null)
continue;
ItemInstance item = template.newInstance(rset.getInt("object_id"));
item.setIndex(rset.getInt("index"));
item.setLocation(ItemLocation.VALUES[rset.getInt("location")]);
item.setOwnerId(objectId);
item.setItemCount(rset.getLong("item_count"));
item.setEnchantLevel(rset.getShort("enchant_level"));
item.setBonusId(rset.getInt("bonus_id"));
item.setAutor(rset.getString("autor"));
equipment.setItem(item, item.getIndex());
}
}
playerPreview.setAppearance(appearance).setEquipment(equipment);
return playerPreview;
} catch(SQLException e) {
LOGGER.warning(e);
} finally {
DBUtils.closeDatabaseCSR(con, statement, rset);
}
return null;
}
您应该在检查完 "not found player" 后关闭 rset
。
您之后正在执行一个新查询,但没有关闭之前的结果集 -> 资源泄漏。
所以我正在做一个项目,但我不确定如何处理这个错误或如何修复它。我已经尝试了我能想到的一切,也许其他人对如何修复它有一些意见。它以 java 编码,用于游戏。错误是 Resource leak: 'rset' is not closed at this location。它挑出的是这一行。
rset = statement.executeQuery("SELECT * FROM `items` WHERE `owner_id` = " + objectId + " AND `location` = " + ItemLocation.EQUIPMENT.ordinal());
希望有人对如何修复此错误有一些意见,我应该取消警告,它会导致内存泄漏或影响程序的性能吗?
public final PlayerPreview restorePreview(int objectId) {
Connection con = null;
PreparedStatement statement = null;
ResultSet rset = null;
try {
con = connectFactory.getConnection();
statement = con.prepareStatement(SELECT_PLAYER_PREVIEW);
statement.setInt(1, objectId);
rset = statement.executeQuery();
if(!rset.next()) {
LOGGER.warning("not found player for " + objectId);
return null;
}
PlayerPreview playerPreview = PlayerPreview.newInstance(objectId);
playerPreview.setSex(rset.getByte("sex"));
playerPreview.setRaceId(rset.getByte("race_id"));
playerPreview.setClassId(rset.getByte("class_id"));
playerPreview.setLevel(rset.getByte("level"));
playerPreview.setOnlineTime(rset.getLong("online_time"));
playerPreview.setName(rset.getString("char_name"));
PlayerAppearance appearance = loadPlayerAppearance(objectId);
if(appearance == null)
return null;
Equipment equipment = PlayerEquipment.newInstance(null);
ItemTable itemTable = ItemTable.getInstance();
{
rset = statement.executeQuery("SELECT * FROM `items` WHERE `owner_id` = " + objectId + " AND `location` = " + ItemLocation.EQUIPMENT.ordinal());
while(rset.next()) {
ItemTemplate template = itemTable.getItem(rset.getInt("item_id"));
if(template == null)
continue;
ItemInstance item = template.newInstance(rset.getInt("object_id"));
item.setIndex(rset.getInt("index"));
item.setLocation(ItemLocation.VALUES[rset.getInt("location")]);
item.setOwnerId(objectId);
item.setItemCount(rset.getLong("item_count"));
item.setEnchantLevel(rset.getShort("enchant_level"));
item.setBonusId(rset.getInt("bonus_id"));
item.setAutor(rset.getString("autor"));
equipment.setItem(item, item.getIndex());
}
}
playerPreview.setAppearance(appearance).setEquipment(equipment);
return playerPreview;
} catch(SQLException e) {
LOGGER.warning(e);
} finally {
DBUtils.closeDatabaseCSR(con, statement, rset);
}
return null;
}
您应该在检查完 "not found player" 后关闭 rset
。
您之后正在执行一个新查询,但没有关闭之前的结果集 -> 资源泄漏。