Tempo de Vida de Um Statement

Estou criando um método que retorna um ResultSet, e preciso que o Statement seja criado dentro do método.

Observem os códigos

public synchronized ResultSet getRequestStatus(String rid) throws SQLException
    {
        Statement que = null;
        try
        {
            que = this.conn.createStatement();
            return que.executeQuery("SELECT tp.id,tp.nome FROM info AS i LEFT JOIN tp_info AS tp ON tp.id = i.tp_info WHERE i.request='" + rid + "' ORDER BY i.data DESC LIMIT 0,1");
        }
        catch(SQLException e) { throw e; }
        finally
        {
            try
            {
               que.close();
               que = null; 
            }
            catch(SQLException e) { throw e; }
        }
        
    }

public synchronized ResultSet getRequestStatus(String rid) throws SQLException
    {
        Statement que = null;
        try
        {
            que = this.conn.createStatement();
            return que.executeQuery("SELECT tp.id,tp.nome FROM info AS i LEFT JOIN tp_info AS tp ON tp.id = i.tp_info WHERE i.request='" + rid + "' ORDER BY i.data DESC LIMIT 0,1");
        }
        catch(SQLException e) { throw e; }        
    }

A primeira forma do método não funciona (claro), pois fecho o Statement antes de usar o ResultSet.

A segunda funciona!, mas não deveria, pois ao findar o escopo do método a variável da Statement perde sua referência (Acho que o gc não é mais aquele).

  1. PorQue isso acontece? i.e. porque tá funcionando?

No final de tudo eu fecho o objeto conn (Objeto do Tipo java.sql.Connection, Que é um atributo da classe),

  1. Faz “mal” eu não fechar as Statement e somente no final fechar a conn?

Isso tudo porque não posso usar mais de um ResultSet ao mesmo tempo gerado pelo mesmo Statement, pois tenho que fazer uma segunda consulta SQL dentro do laço while(res.next()), que usa o valor de um campo como parâmentro, e tenho que usar uma Statement diferente. (Deu pra entender que eu uso somente as interfaces dos métodos de classes, isso abstrai do usuário a conecção com o banco de dados que recebe apenas um objeto ResultSet)

Alguma Opinião?

Obrigado

Sandro Pallocit
sandropallocit@hotmail.com