[ORACLE] Java Stored Procedures + JDBC
Szczepan Marchewka - 30-06-2006 00:08
[ORACLE] Java Stored Procedures + JDBC
Mam w aplikacji Web PLSQL kilka elementow wykonanych jako skladowane procedury Java (PLSQL na pewne rzeczy nie pozwalal), operujace na danych w bazie poprzez wewnetrzne polaczenie JDBC.
Polaczenie JDBC nawiazuje i wykorzystuje w taki sposob: ... Connection conn = null; String sQuery = "select ... "; try { conn = DriverManager.getConnection("jdbc:oracle:kprb:"); PreparedStatement pstmt = conn.prepareStatement(sQuery); pstmt.setFetchSize(1000); ResultSet rs = pstmt.executeQuery(); rs.setFetchSize(1000); while (rs.next()) { String sPole = rs.getString("..."); if (sPole) { ... } ... } } catch (SQLException ex) { .... } ...
Problem w tym, ze ta procedura dziala bez porownania wolniej, niz analogiczna procedura w PLSQL, wykonujaca to samo zapytanie, ale generujaca inny format odpowiedzi.
Czy problem z wydajnoscia spowodowany jest w wiekszym stopniu narzutem obslugi Javy w Oracle niz sama koniecznosc laczenia sie przez wewnetrzne polaczenie JDBC?
Czy mozna w tym przypadku nieco inaczej skorzystac z mechanizmu JDBC, zeby ta procedura dzialala znacznie szybciej?
Czy zastosowanie Ref Cursorow itd itp rozwiaze w pewnym stopniu moj problem?
Szczepan@Marchewka.info.pl ----- In the beginner's mind there are many possibilities, but in the expert's mind there are few. (Shunryu Suzuki 1905-1971)
=?ISO-8859-2?Q?Micha=B3?= Kuratczyk - 30-06-2006 00:08
Szczepan Marchewka wrote: > Connection conn = null; > String sQuery = "select ... "; > try { > conn = DriverManager.getConnection("jdbc:oracle:kprb:"); > PreparedStatement pstmt = conn.prepareStatement(sQuery); > pstmt.setFetchSize(1000); > ResultSet rs = pstmt.executeQuery(); > rs.setFetchSize(1000); > while (rs.next()) { > String sPole = rs.getString("..."); > if (sPole) { > ... > } > ... > } > } catch (SQLException ex) { > ... > } > .. > > Problem w tym, ze ta procedura dziala bez porownania wolniej, niz > analogiczna procedura w PLSQL, wykonujaca to samo zapytanie, ale > generujaca inny format odpowiedzi.
1. Co to znaczy "bez porównania wolniej"? Sekunda zamiast setnych części sekundy, tydzień zamiast pięciu minut, czy co? 2. Skoro masz wersję PL/SQL, która działa dobrze, to nie możesz po prostu w Javie wywołać tej procedury? 3. Uruchom to w sesji przy włączonym sql_trace i zapewne dowiesz się co pochłania najwięcej czasu. Najlepiej wygeneruj sobie od razu analogicznego trace-a dla wersji PL/SQL, żeby mieć porównanie.
-- Michał Kuratczyk
Szczepan Marchewka - 01-07-2006 00:57
> 1. Co to znaczy "bez porównania wolniej"? Sekunda zamiast setnych części > sekundy, tydzień zamiast pięciu minut, czy co?
Znaczy to mniej wiecej 3-4 krotnie dluzszy czas dzialania. Czas ten jest zapisywany przez procedury generujace i mierzony jest w sekundach.
> 2. Skoro masz wersję PL/SQL, która działa dobrze, to nie możesz po prostu > w Javie wywołać tej procedury? PLSQL generuje mi HTML, a w Javie tworze plik XLS, obie zapisuja wyniki w postaci BLOB w bazie danych. Ze wzgledu na koniecznosc wygenerowania XLS musialem uzyc Java. Wygenerowanie prostego CSV i zwrocenie go jako XLS nie zda egzaminu, gdyz musza byc "rowspany" i "colspany" w arkuszu Excela. To nie sa te same procedury, ale roznica w czasie generowania jest moim zdaniem nie do przyjecia.
> 3. Uruchom to w sesji przy włączonym sql_trace i zapewne dowiesz się co > pochłania najwięcej czasu. Najlepiej wygeneruj sobie od razu > analogicznego trace-a dla wersji PL/SQL, żeby mieć porównanie. Czy sql_trace'm moge potraktowac rowniez Jave?
Szczepan@Marchewka.info.pl ----- In the beginner's mind there are many possibilities, but in the expert's mind there are few. (Shunryu Suzuki 1905-1971)
=?ISO-8859-2?Q?Micha=B3?= Kuratczyk - 02-07-2006 00:14
Szczepan Marchewka wrote: >> 3. Uruchom to w sesji przy włączonym sql_trace i zapewne dowiesz się co >> pochłania najwięcej czasu. Najlepiej wygeneruj sobie od razu >> analogicznego trace-a dla wersji PL/SQL, żeby mieć porównanie. > Czy sql_trace'm moge potraktowac rowniez Jave? Prawdę mówiąc nie wiem (raczej wątpię), ale po prostu zrób "alter session set sql_trace=true" i się dowiesz. :-)
Pisząc o sql_trace miałem na myśli, żebyś sprawdził: - czy części wspólne wykonują się tak samo, czy też widać jakieś ewidentne różnice (np. inny plan dla tego samego zapytania wynikający z jakichś ustawień środowiska, albo trochę inaczej zapisanego zapytania) - czy w samej części SQLowej nie widać ewidentnego marnowania czasu (trace całej sesji Twojej procedury)
Jeśli powyższe niczego nie wyjaśni, to potraktuj swoją procedurę jakimś profilerem javy.
-- Michał Kuratczyk
ThomasO@cpas.com - 02-07-2006 00:14
Michał Kuratczyk wrote: > Szczepan Marchewka wrote: > >> 3. Uruchom to w sesji przy włączonym sql_trace i zapewne dowiesz się co > >> pochłania najwięcej czasu. Najlepiej wygeneruj sobie od razu > >> analogicznego trace-a dla wersji PL/SQL, żeby mieć porównanie. > > Czy sql_trace'm moge potraktowac rowniez Jave? > Prawdę mówiąc nie wiem (raczej wątpię), ale po prostu zrób "alter session > set sql_trace=true" i się dowiesz. :-) > > Pisząc o sql_trace miałem na myśli, żebyś sprawdził: > - czy części wspólne wykonują się tak samo, czy też widać jakieś ewidentne > różnice (np. inny plan dla tego samego zapytania wynikający z jakichś > ustawień środowiska, albo trochę inaczej zapisanego zapytania) > - czy w samej części SQLowej nie widać ewidentnego marnowania czasu(trace > całej sesji Twojej procedury) > > Jeśli powyższe niczego nie wyjaśni, to potraktuj swoją procedurę jakimś > profilerem javy. > > -- > Michał Kuratczyk
Z naszych doswiadczenn z Java Stored Procedures: Internal JDBC driver jest tylko troche wolniejszy niz Pl/Sql cursor :5-10%, napewno nie 3-4 razy. To musi byc cos innego. Jak szybka jest Java class do generowania XLS? Zrob maly experyment. W Twojej Java SP nie wywoluj XLS class , tylko zapisz do zwyklego CLOB or BLOB. W ten sposob bedziesz wiedzial czy to problem z JDBC cursor, czy z generowaniem XLS. Thomas
zanotowane.pldoc.pisz.plpdf.pisz.pleffulla.pev.pl
|
Oracle, SQL, PL/SQL. Jak =?ISO-8859-2?Q?napisa=E6_zapytanie=2C?==?ISO-8859-2?Q?_kt=F3re_zwr=F3ci_nazw=EA_atrybutu=2C_kt=F3reg o?==?ISO-8859-2?Q?_warto=B6ci_spe=B3niaj=B1_zadany_warunek?=
Oracle 19g +Insert +Insert +Insert...
[oracle] zapytanie dynamiczne z =?ISO-8859-2?Q?=22dynamiczn=B1_?==?ISO-8859-2?Q?nazw=B1_tabeli=22?=
[Oracle] jak =?ISO-8859-2?Q?ograniczy=E6_pami=EA=E6_dla_se?==?ISO-8859-2?Q?rwera=3F?=
=?ISO-8859-2?Q?=5BOT=5D_Zdany_egzamin_Oracle_1Z0-007_a?==?ISO-8859-2?Q?_brak_informacji_na_stronie_Prometric_-_czy?==?ISO-8859-2?Q?_co=B6_nie_tak=3F?=
[oracle 10g] czy =?ISO-8859-2?Q?mo=BFna_wy=B3=B1czy=E6_wszys?==?ISO-8859-2?Q?tkie_wi=EAzy_w_schemacie=3F?=
MSSQL Express czy Oracle Express
=?iso-8859-2?q?[oracle]_Jak_sprawdzi=E6_wielko=B6=E6_tabeli_=3F=3F?=
=?ISO-8859-2?Q?Poszukjue_ksi=B1=BFki_"Oracle_?= =?ISO-8859-2?Q?optymalizacja_wydajno=B6ci"..?=
[Oracle] =?ISO-8859-2?Q?=A3=B1czenie_wierszy_z_zapytania_?==?ISO-8859-2?Q?w_jeden_string?=
zanotowane.pldoc.pisz.plpdf.pisz.plmelooonka.opx.pl
Cytat
Decede mihi sole - nie zasłaniaj mi słonca. Gdy kogoś kochasz, jesteś jak stworzyciel świata - na cokolwiek spojrzysz, nabiera to kształtu, wypełnia się barwą, światłem. Powietrze przytula się do ciebie, choćby był mróz, a ty masz w sobie tyle radości, że musisz ją rozdawać wokoło, bo się w tobie nie mieści Hoc fac - tak czyń. A tergo - od tyłu; z tyłu. I czarne włosy posiwieją. Safona |
|