sql >> Database teknologi >  >> RDS >> Mysql

Returnerer et resultatsæt

Du bør aldrig videregive et ResultSet rundt gennem offentlige metoder. Dette er tilbøjeligt til ressourcelækage, fordi du er tvunget til at holde erklæringen og forbindelsen åbne. At lukke dem ville implicit lukke resultatsættet. Men at holde dem åbne ville få dem til at dingle rundt og få databasen til at løbe tør for ressourcer, når der er for mange af dem åbne.

Tilknyt det til en samling af Javabeans som sådan og returner det i stedet:

public List<Biler> list() throws SQLException {
    Connection connection = null;
    PreparedStatement statement = null;
    ResultSet resultSet = null;
    List<Biler> bilers = new ArrayList<Biler>();

    try {
        connection = database.getConnection();
        statement = connection.prepareStatement("SELECT id, name, value FROM Biler");
        resultSet = statement.executeQuery();

        while (resultSet.next()) {
            Biler biler = new Biler();
            biler.setId(resultSet.getLong("id"));
            biler.setName(resultSet.getString("name"));
            biler.setValue(resultSet.getInt("value"));
            bilers.add(biler);
        }
    } finally {
        if (resultSet != null) try { resultSet.close(); } catch (SQLException ignore) {}
        if (statement != null) try { statement.close(); } catch (SQLException ignore) {}
        if (connection != null) try { connection.close(); } catch (SQLException ignore) {}
    }

    return bilers;
}

Eller, hvis du allerede er på Java 7, skal du bare bruge prøv-med-ressourcer erklæring, som automatisk lukker disse ressourcer:

public List<Biler> list() throws SQLException {
    List<Biler> bilers = new ArrayList<Biler>();

    try (
        Connection connection = database.getConnection();
        PreparedStatement statement = connection.prepareStatement("SELECT id, name, value FROM Biler");
        ResultSet resultSet = statement.executeQuery();
    ) {
        while (resultSet.next()) {
            Biler biler = new Biler();
            biler.setId(resultSet.getLong("id"));
            biler.setName(resultSet.getString("name"));
            biler.setValue(resultSet.getInt("value"));
            bilers.add(biler);
        }
    }

    return bilers;
}

I øvrigt bør du ikke erklære Connection , Statement og ResultSet som instansvariable overhovedet (større trådsikkerhedsproblem!), og heller ikke sluge SQLException på det tidspunkt overhovedet (den, der ringer, har ingen anelse om, at der opstod et problem), og lukker heller ikke ressourcerne i samme try (hvis f.eks. resultatsæt lukke afgiver en undtagelse, så er sætning og forbindelse stadig åbne). Alle disse problemer er løst i ovenstående kodestykker.



  1. Postgresql-udtræk sidste række for hvert id

  2. EXTRACT() Eksempler – MySQL

  3. Oracles containere til J2EE (OC4J) i R12

  4. Fundamentals of Table Expressions, Del 13 – Inline Table-Valued Functions, Fortsat