usuwanie z bazy w trybie autocommit

0

hej,
korzystajac z JDBC musze usuwac rekordy z bazy. rekordy maja isc paczkami, po 50 w trybie autocommit. troche nie za bardzo wiem jak to zrobic. bo w sumie to bedzie zwykle polecenie "

"delete from tabela_test where data_start < now()"

". czyli normalnie powinno byc:

Connection con = ...
Statement st = con.createStatement();
st.executeQuery("delete from tabela_test where data_start < now()")

no ale jak teraz zrobic by to szlo paczkami po 50? :|

0

tzn 50 zapytań ? Nie da się tego zoptymalizować ? :)
Potrzebujesz PreparedStatement http://cupi2.uniandes.edu.co/site/images/recursos/javadoc/j2se/1.5.0/docs/api/java/sql/PreparedStatement.html
A konkretnie to addBatch i execute.
Nie pytałaś przypadkiem o to samo tutaj:
http://4programmers.net/Forum/viewtopic.php?id=164871 ?

0

nie. tzn moze i tak, ale widocznie nie rozumiem do konca i dla mnie to 2 inne rzeczy. wlasnie jak robilam te inserty, dodawalam batche i potem jak np juz 50 bylo to robilam executeBatch. ale tutaj sytuacja jest inna. tzn moze wlasnie mi sie tylko wydaje ze jest inna.

bo patrz: tam sobie mialam preparedStatement przygotowany, np:

"insert into test(imie, nazwisko) values ?,?"

potem gdzies w programie, po kolei jak przyplywaly dane to robilam po prostu

prepStatement.setString(1, imie);
prepStatement.setString(2, nazwisko);

jak sie tego zrobilo 50, to execute batch. no ale tutaj sytuacja jest inna. bo ja nie bede miala tak, ze w programie beda splywaly jakies informacje typu 'dodaj do prepared statement jakies rzeczy'. tylko po znalezieniu odpowiedniego warunku (daty), ja mam tylko wykonac "delete from test where start_date < now()"; ja tutaj w ogole nie widze preparedStatement. no bo gdzie i jak i po co?

nie rozumiem :(

0

To będzie 50 różnych zapytań typu delete ?

0

przecież taki delete skasuje x - wierszy które spełniają Twój warunek czyli data_start < now(), więc to tak jakby kasowało w paczce - od razu wszystkie rekordy które Cię interesują ; )

0

no wlasnie wiem. i to jest to czego nie rozumiem. tzn tak to sobie wyobrazalam ze to ma byc zrobione ze on usuwa po 50 rekordow, az dojedzie do konca. ale tak sie chyba nie da zrobic co?

tzn, czy da sie zrobic tak: "delete.. where date_start<now()" co 50 rekordow.

0

kurde juz totalnie zglupialam jak mam to zrobic :|

0

A co próbujesz osiągnąć ? Bo chyba nie rozumiem. Jeśli chcesz ograniczyć ilość kasowanych rekordów to możesz dodać LIMIT 50 do zapytania ale chyba nie o to Ci chodzi. Może opisz co jest w tej tabeli i co chcesz usunąć.

0

chce usuwac rekordy, przy warunku ze date_start < date2. gdzie date_start dostane w ktoryms miejscu programu. tabela ma ogolnie pare milionow wpisow. i sie zastanawialam czy to mozna zrobic tak, ze robie ten delete, ale zeby nagle nie bylo ze ma za jednym razem usunac 10mln rekordow, to on by sobie tego delete robil ale w paczkach (np po 50). i jesli np normalnie polecenie:

"delete from test where date_start < date2"

mialoby usunac np 1mln rekordow to by to zostalo podzielone (o ile tak sie da) ze on by sobie to polecenie podzielil-typu "zrob tego delete, ale zamiast usuwac 1mln rekordow to zrob to w paczkach po 50 rekordow".

nie wiem czy tak sie da zrobic w ogole? i czy to jest wlasciwy tor myslenia?

0

Da się ale pytanie czy to ma sens, usunięcie mln rekordów zajmie pare sekund. Dzielenie na paczki miało by sens, gdybyś robiła to w odstępach czasowych ale wydaje mi się to sporą przesadą.
Jak koniecznie chcesz to zrobić to PreparedStatement i ten sam SQL którego masz tylko dodaj do zapytania LIMIT X, gdzie X * Y = ilość rekordów do skasowania i dodaj to zapytanie Y razy do PreparedStatement. Jeszcze raz tylko powtórzę, że nie wydaje mi się, żeby to miało poprawić wydajność.

0

nie ma limit w postgresie dla operacji typu delete (ani chyba tez dla update)

co do reszty Twoich uwag-zgadzam sie. bo odpalilam program i faktycznie zajelo to pare sek.
ale tak juz sie teraz z czystej ciekawosci zastanawialam czy da sie to zrobic i jak..

pzdr

0

Myślałem, że LIMIT jest w standardzie :) Widać tylko MySQL go obsługuje na DELETE. Ale to można łatwo zasymulować:
DELETE FROM

0

w sumie tak. ale to faktycznie bez sensu. ja myslalam ze moze w api javy jest cos, to pozwoliloby mi na zrobienie tego. cos szybkiego, fajnego i ogolnie polecanego :)

dam sobie z spokoj z tym dzieleniem. taka operacja to faktycznie kilka sekund i jest ok.

    pzdr i dzieki za wszystkie rady :)


         misty

1 użytkowników online, w tym zalogowanych: 0, gości: 1