Cześć, piszę aktualnie program w Javie, który ma generować dane do bazy. Ogólnie kończę już pracę nad tym, jednak mam jeszcze jeden problem... W zasadzie jest to chyba ostatnia rzecz, którą muszę dokończyć. Może przejdę do problemu.
W bazie mam tabelę z towarami oraz jest też tabela pozycja faktury.
W tabeli pozycja faktury mam do zapełnienia pola takie jak: ilość danego towaru. Żeby generator generował realne dane, takie jakie mogłyby być w rzeczywistości to muszę najpierw sprawdzić, ile danego towaru jest na stanie zanim wylosuję liczbę.
Działa to u mnie tak:
- Losuję sobie id z tabeli towary
- Sprawdzam ilość sztuk na magazynie danego towaru
- Losuję ilość sztuk, tak żeby nie przekroczyć faktycznej wartości.
Wszystko fajnie pięknie mam zrobione. Jednak w czym jest problem? A w tym, że przez metodę, która sprawdza ilość sztuk na magazynie danego towaru, 1000 wierszy do około 10 tabel wstawia się ponad 7 minut. Bez tej metody jest to 10 sekund. Czyli sama metoda wykonuje się jakieś 7 minut.
A dlaczego się tak dzieje?
Dzieje się tak, dlatego że metodę wykonuję w pętli. Czyli 1000x wykonuje się executeQuery(). I tutaj nie wiem jak sobie z tym poradzić.
Przy insertach nie było problemu, po prostu używałem metody addBatch(), a po zakończonej pętli executeBatch().
Ale przy selectach o ile wiem nie da się zrobić czegoś takiego.
Macie jakieś pomysły jak można by rozwiązać ten problem?
Poniżej znajduje się metoda na sprawdzenie tej ilości sztuk na magazynie. Wywoływana jest ona w pętli, przykładowo dla 1000 wykonań, metoda wykonuje się jakieś 7 minut.
public static int Sprawdz_ilosc_magazynowa_towaru(Connection baza, int klucz)
{
int ilosc_magazynowa = 0;
try
{
PreparedStatement prepared = baza.prepareStatement("select ilosc_magazynowa from Towary where id_towaru="+klucz);
prepared.setFetchSize(4001);
ResultSet wyniki = prepared.executeQuery();
if(wyniki.next()) ilosc_magazynowa = wyniki.getInt("ilosc_magazynowa");
wyniki.close();
prepared.close();
}
catch(Exception e)
{
}
return ilosc_magazynowa;
}