PSQLException: этот ResultSet закрыт Postgresql db [duplicate]

Вы также можете использовать для него аниматор:

int secondsToRun = 999;

ValueAnimator timer = ValueAnimator.ofInt(secondsToRun);
timer.setDuration(secondsToRun * 1000).setInterpolator(new LinearInterpolator());
timer.addUpdateListener(new ValueAnimator.AnimatorUpdateListener()
    {
        @Override
        public void onAnimationUpdate(ValueAnimator animation)
        {
            int elapsedSeconds = (int) animation.getAnimatedValue();
            int minutes = elapsedSeconds / 60;
            int seconds = elapsedSeconds % 60;

            textView.setText(String.format("%d:%02d", minutes, seconds));
        }
    });
timer.start();
2
задан giozh 28 June 2013 в 16:56
поделиться

4 ответа

, когда вы закрываете объект соединения в вашем методе getProduttori, ваш результирующий набор будет автоматически закрыт .

ResultSet rs = ProduttoreDCS.getProduttori();
             = null, as you have closed the connection in getProduttori
               method, which will automatically close the resultset 
               thus, it returns null.

From Connection # close

Освобождает базу данных объекта Connection и JDBC немедленно, вместо того, чтобы ждать их автоматического выхода.

применяется при закрытии заявления также. Для того, чтобы ваш код работал, не закрывайте Statement и Connection, пока вы не получите строки .

@ Бадшах уже показал вам стандартный способ. Если вы используете java 7+, вы можете использовать блок try-with-resource, который упростит вашу жизнь.

 try(Connection conn = gettheconn){
     get the statement here
     get the result set 
      perform your ops
 }
 catch(SQLException ex){
   ex.printstacktrace(); 
  }

Если вы заметили, что окончательного блока нет, ваш объект соединения будет закрыт, как только вы выйдете из блока try автоматически. У вас нет необходимости в вызове экспликации Connection # close ()

4
ответ дан PermGenError 22 August 2018 в 01:51
поделиться
  • 1
    поэтому мне просто нужно перенести первую часть кода внутри метода getProduttori и вернуть метод ArrayList методу вызывающего? – giozh 28 June 2013 в 17:05
  • 2
    да, это действительно стандартный способ сделать это – PermGenError 28 June 2013 в 17:06
  • 3
    +1 для блока try-with-resource :) вы разбудили меня – ꜱᴜʀᴇꜱʜ ᴀᴛᴛᴀ 28 June 2013 в 17:18
  • 4
    да, я заставил свою команду перейти на java 7, чтобы я мог пропустить все эти, наконец, блок-драму при использовании JDBC. :П – PermGenError 28 June 2013 в 17:20

В этом проблема:

stmt.close();
conn.close();

Вы закрываете соединение с базой данных. Вы не можете этого сделать, пока не прочитаете данные, иначе как ResultSet будет читать его? Возможно, он будет читать некоторые данные для начала, но это не значит, что это отключенный объект.

В частности, из документа для ResultSet.close:

Примечание. Объект ResultSet автоматически закрывается объектом Statement, который сгенерировал его, когда этот объект Statement закрыт, повторно выполняется или используется для извлечения следующего результата из последовательности нескольких результатов.

3
ответ дан Jon Skeet 22 August 2018 в 01:51
поделиться

Закрытие соединения приводит к тому, что resultSet уходит.

ResultSet не является контейнером, который вы можете использовать для передачи данных, это всего лишь оболочка вокруг курсора. Вы должны запустить содержимое resultSet и скопировать их в структуру данных, а затем вернуть структуру данных. Вы уже это делаете, но вам нужно сделать это до закрытия оператора и соединения.

Измените код на:

public static List<String[]> getProduttori() throws ClassNotFoundException, SQLException {

    ArrayList<String[]> res = new ArrayList<String[]>();
    /*
     * retrieve all record from produttori table
     */
    Connection conn = null;
    ResultSet rs = null;
    Statement stmt = null;
    String query = "SELECT * FROM produttore";

    conn = ConnectionManager.getConnection();
    try {
        System.out.println("Connection obtained by ProduttoreDCS class");
        stmt = conn.createStatement();
        try {
            rs = stmt.executeQuery(query);
            while (rs.next()) {
                String[] current = new String[6];
                current[0] = Integer.toString(rs.getInt("partita_iva"));
                current[1] = rs.getString("nome");
                current[2] = rs.getString("cognome");
                current[3] = rs.getString("via_sede");
                current[4] = rs.getString("citta_sede");
                current[5] = rs.getString("provincia_sede");
                res.add(current);
            }        
            return res;
        } finally {
            try {
                stmt.close();
            } catch (SQLException e) {
                log.error(e);
            }
        }
    } finally {
        try {
        conn.close();
        } catch (SQLException e) {
            log.error(e);
        }
    }        
}
1
ответ дан Nathan Hughes 22 August 2018 в 01:51
поделиться
  • 1
    Проблема в том, что если вы хотите абстрагировать вызовы базы данных в отдельный класс, это становится затруднительным с этой методикой, потому что здесь вы смешиваете данные класса с методами подключения к базе данных. – JohnMerlino 7 July 2014 в 06:55
  • 2
    @ Джон: согласился, я предпочел бы использовать весну здесь с spring-jdbc, поддерживая соединение-приобретать полностью отдельно. мне просто не казалось, что это часть вопроса. – Nathan Hughes 7 July 2014 в 13:48

В соответствии с Docs

Объект ResultSet автоматически закрывается, когда объект Statement, который сгенерировал его, закрывается, повторно выполняется или используется для извлечения следующего результата из последовательности нескольких результатов.

Вы закрыли соединение, а затем выполняете итерацию, где оно равно null. Пожалуйста, прочитайте данные и затем закройте соединение.

Хорошей практикой является

Connection conn = null;
PreparedStatement stmt = null;
ResultSet rs = null;
try {
    conn = 
    stmt = conn.prepareStatement("sql");
    rs = stmt.executeQuery();
   //DO SOME THING HERE
} catch {
    // Error Handling
} finally {
    try { if (rs != null) rs.close(); } catch (Exception e) {};
    try { if (stmt != null) stmt.close(); } catch (Exception e) {};
    try { if (conn != null) conn.close(); } catch (Exception e) {};
}
3
ответ дан ꜱᴜʀᴇꜱʜ ᴀᴛᴛᴀ 22 August 2018 в 01:51
поделиться
  • 1
    i сердце try with resource из java 7 :) – PermGenError 28 June 2013 в 17:10
  • 2
    @PermGenError да да .. это существующий код :) Haaav .. нужно переместить java 7: P – ꜱᴜʀᴇꜱʜ ᴀᴛᴛᴀ 28 June 2013 в 17:15
Другие вопросы по тегам:

Похожие вопросы: