Mysql
 sql >> Teknologi Basis Data >  >> RDS >> Mysql

Mengembalikan HasilSet

Anda tidak boleh melewatkan ResultSet sekitar melalui metode publik. Ini rentan terhadap kebocoran sumber daya karena Anda terpaksa menjaga pernyataan dan koneksi tetap terbuka. Menutupnya secara implisit akan menutup set hasil. Tetapi membiarkannya tetap terbuka akan menyebabkannya menggantung dan menyebabkan DB kehabisan sumber daya jika terlalu banyak yang dibuka.

Petakan ke kumpulan Javabeans seperti itu dan kembalikan sebagai gantinya:

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

Atau, jika Anda sudah menggunakan Java 7, gunakan saja coba-dengan-sumber daya pernyataan yang akan menutup sumber daya tersebut secara otomatis:

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

Omong-omong, Anda tidak boleh mendeklarasikan Connection , Statement dan ResultSet sebagai variabel instan sama sekali (masalah keamanan utas utama!), atau menelan SQLException pada saat itu sama sekali (penelepon tidak akan tahu bahwa terjadi masalah), atau menutup sumber daya dalam try yang sama (jika misalnya result set close melempar pengecualian, maka pernyataan dan koneksi masih terbuka). Semua masalah tersebut diperbaiki dalam cuplikan kode di atas.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Beberapa pernyataan mysql INSERT dalam satu kueri php

  2. Diperlukan untuk menggabungkan 2 tabel dengan FK mereka di tabel ke-3

  3. Menulis ulang mysql pilih untuk mengurangi waktu dan menulis tmp ke disk

  4. LAST_DAY() Contoh – MySQL

  5. Apakah Anda diizinkan menggunakan angka sebagai nama tabel di MySQL?