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
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.