[ vokus @ 07.08.2004. 16:39 ] @
Trenutno radim serversku aplikaciju u programskom jeziku Java, koja vrši akviziciju podataka i iste smešta u Oracle bazu pomoći stored procedure na sledeći način:

CallableStatement ps;
ps = c.prepareCall("{call PROC_INSERT(?, ?, ?, ?, ?, ?, ?, ?, ?)}");
ps.setInt(1, iX);
ps.setString(2, strY);
...
ps.execute();
ps.close();

Sve exception-e u Javi hvatam i zapisujem u log fajl. Posle neko vreme u log dobijam poruku "Maximum open cursors number exceeded" i moram da resetujem serversku aplikaciju (što normalno ne bi trebalo da se desi).

Kako da rešim ovaj problem?

Moguće li je da kad se u Oracle pojavi neka greška da tad ostane kursor nezatvoren? Kako bi mogao u Oracle procedure ili funkcije da hvatam exceptions?
[ CandyMan @ 07.08.2004. 22:21 ] @
Pretpostavljam da ti je Google dao zadovoljavajuće rezultate, ali za svaki slučaj:
http://www.orafaq.com/error/ora-01000.htm

U napred se izvinjavam ukoliko potcenim tvoje znanje.

Ovako,
moja prva pretpostavka jeste da procedura nije dobro napisana. Ukoliko ti nije problem, uradi copy/paste koda ili nečeg što liči na kod pomenute procedure, pa ćemo da vidimo šta ne valja.

Svaka procedura otprilike izgleda ovako:
Code:

procedure Ime_Procedure(parametar1 in out tip_parametra)
...
begin
 ... 
exception
  when EXCEPTION1 then
    neki_kod1;
  when EXCEPTION2 then
    neki_kod2;
  ...
end;


Lepi primeri (opet Google)
http://www.cise.ufl.edu/help/d...dev.920/a96624/07_errs.htm#725
http://www.hk8.org/old_web/oracle/langpkt/ch01_10.htm

E sad, kaži šta dalje, da bi izbegli proizvoljnosti...

[ vokus @ 07.08.2004. 23:37 ] @
Hvala na linkovima. Tokom sledećih dana probaću da uradim nešto.

Evo jedna procedura, ostale su skoro iste:

Code:

create or replace PROCEDURE "NEWDPFS" (
 nAlType         in ALARMS.ALARM_TYPE_ID%type,
 strBSC_ID       in BS_CONTROLERS.STR_ID%type,
 dateStart       in ALARMS.TIME_START%type,
 nAlarmSeq       in ALARMS.ALARM_NUMBER%type,
 strDPFS_DIP     in ALARM_DPFS.DIP%type,
 strDPFS_FAULT   in ALARM_DPFS.FAULT%type,
 strDPFS_DIPEND  in ALARM_DPFS.DIPEND%type,
 strDPFS_HG      in ALARM_DPFS.HG%type,
 strDPFS_SECTION in ALARM_DPFS.SECTION%type,
 strDPFT_STATE   in ALARM_DPFS.STATE%type
)
is
  nbscid NUMBER;
begin
  SELECT BSC_ID INTO nbscid FROM BS_CONTROLLERS WHERE LOGIC_NAME = strBSC_ID;
  insert into ALARMS
        (TIME_START, ALARM_TYPE_ID, ALARM_NUMBER, BSC_ID, ALARM_ID)
    VALUES
        (dateStart, nAlType, nAlarmSeq, nbscid, ALARM_SEQ.NextVal);
  insert into ALARM_DPFS
        (DPFS_ID, ALARM_ID, DIP, DIPEND, FAULT, HG, SECTION, STATE)
    VALUES
        (DPFS_SEQ.NextVal, ALARM_SEQ.CurrVal, strDPFS_DIP, strDPFS_DIPEND, strDPFS_FAULT, strDPFS_HG, strDPFS_SECTION, strDPFS_STATE);
end;


Ako imaš neku primedbu slobodno kaži.

Pozdrav.
[ noctua @ 09.08.2004. 08:19 ] @
Pozdrav!

ja cu laicki da uskocim u ovu temu bez da analiziram kod:
Mozda ti je broj otvorenih kursora limitiran na suvise malu vrednost. Prilikom instalacije prazna baza ima postavljen max broj kursora na (cinimi se) 300.
E, postavljaju se pitanja: da li se neko igrao i menjao te vrednosti; koliko ima korisnika koji rade nesto nad bazom dok ti pokusavas da izvrsis svoju aplikaciju (moguce da su drugi vec pootvarali kursore i zauzeli resurse pa ti sa nekoliko iteracija prekoracis limit...); sta se sve nalazi u toj bazi (ukoliko se tu umuvao i neki AS ili nesto slicno, onda je on "pojeo" dobar deo kursora)...
A moguce je i da je greska u samom kodu :)
Testiraj malo (razlicit broj trenutno aktivnih korisnika/aplikacija/...) pa javi sta se desava...
[ me-tuzalem @ 09.08.2004. 08:32 ] @
Koliko ja vidim, trebalo bi da u okviru

Code:
catch(Excpetion e){
// imaš
       ps.close(); // naravno i to ide u try ... catch

}



Tako ćeš pozatvarati Statemente, a to je ono što prouzrokuje grešku.
To što u glavnom delu koda imaš ps.close() je OK kada nema greške, ali kada se dogodi Exception, a on se događa u okviru ps.execute(), ostaje Statement otvoren, i tako se malo po malo arče resursi.
[ vokus @ 09.08.2004. 22:36 ] @
Mislim da je ograničenje broja otvorenih kursora (zadano od administratora baze) nije problem, zato što program radi nekoliko dana, a nakon toga otkako je nekako izotvarao te kursore, non-stop se dobija poruka da je maksimum otvorenih kursora postignut - više ni jednom se ne startuje neka stored procedura.

A plus to i onako nemam administratirske privilegije na bazu.
[ me-tuzalem @ 10.08.2004. 09:17 ] @
Hej, Vokus,
ne čitaš odgovore.
Definitivno je problem u tome što nakon Exceptiona u okviru catch bloka, MORAŠ da imaš

Code:
ps.close()


Imao sam svojevremeno sličan problem i definitivno je tako otklonjen. Nisu te valjda moje greške u kucanju zbunile?
[ trivuns @ 12.08.2004. 08:56 ] @
Ti samo otvaraš kursore, i naravno da je posle par dana...
@me-tuzalem dobro zbori