2015-06-24 2 views
0

Так что я работаю над проектом, и я не уверен, как справиться с этой ошибкой или что можно сделать, чтобы исправить это. Я пробовал все, что мог придумать, может быть, у кого-то есть какой-то вклад в том, как это исправить. он закодирован в java и предназначен для игры. Ошибка утечки ресурсов: «rset» не закрывается в этом месте. именно эта линия выделяется.Утечка ресурсов: 'rset' не закрывается в этом месте

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; 
} 

ответ

1

Вы должны закрыть rset после окончания проверки на «не нашел игрока».

После этого вы выполняете новый запрос, но не закрываете предыдущий набор результатов -> утечка ресурсов.

+0

Большое вам спасибо за то, что меня заводило! – user3109488

Смежные вопросы