sql >> Databáze >  >> RDS >> Mysql

Vrácení sady výsledků

Nikdy byste neměli předat ResultSet prostřednictvím veřejných metod. To je náchylné k úniku prostředků, protože jste nuceni ponechat prohlášení a připojení otevřené. Jejich uzavření by implicitně uzavřelo sadu výsledků. Ale jejich ponechání otevřené by způsobilo, že by se povalovaly a v DB by došly zdroje, když jich je otevřených příliš mnoho.

Namapujte jej na kolekci podobných Javabeanů a místo toho jej vraťte:

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

Nebo, pokud již používáte Java 7, použijte try-with-resources příkaz, který tyto zdroje automaticky zavře:

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

Mimochodem, neměli byste deklarovat Connection , Statement a ResultSet jako proměnné instance vůbec (hlavní problém bezpečnosti vláken!), ani spolknout SQLException v tom okamžiku vůbec (volající nebude mít tušení, že došlo k problému), ani nebude zavírat zdroje ve stejném try (pokud např. zavřít sadu výsledků vyvolá výjimku, příkaz a připojení jsou stále otevřené). Všechny tyto problémy jsou opraveny ve výše uvedených fragmentech kódu.



  1. Mohu ve spouštěči Oracle přiřadit nové a staré proměnné typu řádku?

  2. Můj DBA je nemocný – Tipy pro přepnutí databáze při selhání databáze pro správce systému

  3. Definujte kroky pro SQL Server Cursor - SQL Server / TSQL výukový program

  4. Úložiště dotazů SQL Server