Tworzę naprawdę intensywny program Java DB, ale napotkałem błąd na połączeniach. Kod jest:

try{
        Statement st;
        ResultSet rs;
        conn = DBConnection.dbconnection();
        st = conn.createStatement();
        String s = "select *  from tab2DB order by Scadenza";
        rs = st.executeQuery(s);
        while(rs.next()){
            ResultSet rs2;
            PreparedStatement st2;
            conn2 = DBConnection.connection();
            String s2 = "select * from Prodotti where Nome = ?";
            st2 = conn2.prepareStatement(s2);
            st2.setString(1, rs.getString("Prodotto"));
            rs2 = st2.executeQuery();               
            while(rs2.next()){

                Date localDate = new Date();

                String scadenza =  rs.getString("Scadenza");
                DateFormat format = new SimpleDateFormat("yyyy-MM-dd", Locale.ITALIAN);
                Date date = format.parse(scadenza);



                if(localDate.after(date)){
                        conn3 = DBConnection.dbconnection();        
                        String query ="insert into tabDB values ('"+nomeord+"','"+prodottoord+"','"+quantitàord+"')";
                        Statement stmt;
                        stmt = conn3.createStatement();
                        stmt.executeUpdate(query);
                        conn3.close();
                        continue;
                }

                //other building of interface in the while, omitted for clarity purpose
                conn2.close();
                rs2.close();
                }
                conn.close();
                rs.close();
    }
    catch (SQLException e1) {
        // TODO Auto-generated catch block
        e1.printStackTrace();
    } catch (ParseException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }

Błąd znajduje się na IF (LocalDate.After (data)) {...} gdzie stmt.executeupdate (zapytanie); Przygotuje błąd i rozbija program. Myślę, że problem tutaj jest, że DB ma już otwarte połączenie i nie może obsługiwać Con3, ale potrzebuję tych innych połączeń za cykl podczas gdy cykl, a jednocześnie muszę być w stanie oddać rozkazy wewnątrz, jeśli podczas gdy w cykl. Jak mogę to zrobić, aby nowe zamówienie nie przeszkadzało w czasie cykli, ale w tym samym czasie wykonuje zapytanie?

(Czym zapytanie o zapytanie może nie działać w powyższym kodzie, jest to fragment większa klasy)

Dziękuję za pomoc!

4
Andrea Stella 15 luty 2017, 16:05

2 odpowiedzi

Najlepsza odpowiedź

Można użyć wykorzystywania środków próbnych, co zapewnia, że wszystkie zasoby są zamknięte na końcu oświadczenia.

Przykład:

try (Connection con = ConnectionManager.dbconnection();
    Statement statement = con.createStatement();
    ResultSet resultSet = statement.executeQuery(query)) {
        while(resultSet.next) {
            //Add desired values to data structure
        }
}

Dodatkowo, jak wspominali innych użytkowników, polecam iteracji przez wyniki i dodając do czegoś jak lista, zestaw lub mapę. W ten sposób możesz zamknąć połączenie i nadal dostęp do danych z innego obiektu.

2
Link79097 15 luty 2017, 13:58

Powinieneś zadzwonić close() na obiektach Connection, gdy tylko zapytanie zostało wykonane.

Również, conn1 zostaje nawiązany do DBConnection.dbconnection(); conn2 zostaje nawiązany do DBConnection.connection(); conn3 zostaje nawiązane do DBConnection.dbconnection();

Zobacz różnicę?

0
FrederikVH 15 luty 2017, 13:19