[MYSQL] Błąd i pytanie

jbrudek | 2021-02-17 10:25:23 UTC | #1

Hej mam plugin w którym pobieram zapytania przy użyciu asynchronicznego zapytania mysql, na początku wszystko działa OK, lecz po około 50 minutach wywala błąd

java.sql.SQLException: Operation not allowed after ResultSet closed

Cała metoda:

public static void CHALLENGE_CZAS(final Player p)
    {
        ResultSet result = null;
        try
        {
            result = statement.executeQuery(GET_CHALL_TABLE.replace("{NICK}", p.getName()));

            List<Integer> inne = new ArrayList<>();

            if(result.next())
            {
                inne.add(result.getInt("czas1"));
                inne.add(result.getInt("czas2"));
                inne.add(result.getInt("czas3"));
                inne.add(result.getInt("czas4"));
                inne.add(result.getInt("czas5"));
                inne.add(result.getInt("czas6"));
                inne.add(result.getInt("czas7"));
            }

            HashMaps.getChallengeCzas.put(p.getName(), inne);
        }
        catch (SQLException ex)
        {
            ex.printStackTrace();
        }
    }

Ma ktoś jakiś pomysł jak rozwiązać to bez błędów?

HashMap do którego “wkładam” dane:
HashMap> getChallengeInne = new HashMap<>();


Nieznajomy11 | 2020-06-04 20:16:17 UTC | #2

Pomijając okropieństwo klasy HashMaps, tej metody i całego nazewnictwa, to problem polega na tym, że nie powinieneś zapisywać nigdzie statement, tylko za każdym razem ogarniać sobie Connection (najlepiej z jakiegoś poola) w try-with-resources lub klasycznie, dbając o zamykanie (co raczej odradzam bez ważnego powodu).

Biblioteka do obsługi baz danych, którą dobrze byłoby się zainteresować (znajdziesz też tam gotowe przykłady kodu):

https://github.com/brettwooldridge/HikariCP


jbrudek | 2020-06-04 20:16:24 UTC | #3

dzięki!


Nieznajomy11 | 2020-06-04 20:19:42 UTC | #4

Nie zapomnij tylko jeszcze, żeby używać PreparedStatement, bo twój kod staje się podatny na ataki SQL Injection przez takie postępowanie:
[quote=”jbrudek, post:1, topic:15025”]
GETCHALLTABLE.replace(“{NICK}”, p.getName())
[/quote]

https://pl.wikipedia.org/wiki/SQL_injection

Akurat w tym przypadku jesteś bezpieczny, ale tylko zakładając, że nicki graczy nie mogą zawierać znaków typu cudzysłów.


jbrudek | 2020-06-04 20:19:59 UTC | #5

tak znam tę metodę hakowania od pana Zelenta, ale w tym przypadku to nie możliwe, ale i tak dziękuje


Nieznajomy11 | 2020-06-04 20:21:49 UTC | #6

To niekoniecznie najlepsze źródło do nauki, jest tam sporo starych rzeczy i błędów. W każdym razie zwyczajnie najlepiej używać wszędzie do takich rzeczy gdzie możesz prepared, tak aby uniknąć konieczności rozróżniania i potencjalnego wystawiania się na dziury w aplikacji. Poleganie na założeniu, że dane będą ok, to właśnie pierwszy krok do udanego sql injection.


jbrudek | 2020-06-04 20:23:04 UTC | #7

Spokojnie nie uczyłem się od Zelenta, po prostu ogladałem nie dawno jego odcinek o Google CTF, zastosuję się do rady :smiley:


system | 2021-02-17 10:31:45 UTC | #8

Ten temat został automatycznie zamknięty 32 dni po ostatnim wpisie. Tworzenie nowych odpowiedzi nie jest już możliwe.