ďťż
 
[ORACLE] Java Stored Procedures + JDBC ďťż
 
[ORACLE] Java Stored Procedures + JDBC
Zobacz wiadomości
 
Cytat
A gdyby tak się wedrzeć na umysłów górę, / Gdyby stanąć na ludzkich myśli piramidzie, / I przebić czołem przesądów chmurę, / I być najwyższą myślą wcieloną. . . Juliusz Słowacki, Kordian
Indeks BCB i MySQL subiekt gt fototapeta
 
  Witamy

[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.pl
  • doc.pisz.pl
  • pdf.pisz.pl
  • effulla.pev.pl
  • comp
    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.pl
  • doc.pisz.pl
  • pdf.pisz.pl
  • melooonka.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

    Valid HTML 4.01 Transitional

    Free website template provided by freeweblooks.com