Exception - kann mit der Fehlermeldung nix anfangen

Status
Nicht offen für weitere Antworten.

bambi

Bekanntes Mitglied
Also ich arbeite mit EJB's und so...

Was ich mache ist: ich habe einen TimerTask, der mir 1x pro Stunde Daten aus einer DB holt (per findAll() ), die dann etwas "bearbeitet" und in eine HashMap schreibt. Diese Map schreib ich dann in den Cache und arbeite dann damit weiter...

Mein Problem ist jetzt: wenn ich den Server ein paar Stunden laufen lasse, dann bekomme ich eine Exception und es geht gar nix mehr:

Code:
>> ... Exception caught while extracting/merging data java.rmi.RemoteException: EJB Exception: ; nested exception is: 
	javax.ejb.EJBException: EJB Exception: : weblogic.jdbc.extensions.PoolLimitSQLException: weblogic.common.resourcepool.ResourceLimitException: No resources currently available in pool cedPool to allocate to applications, please increase the size of the pool and retry..
	at weblogic.jdbc.common.internal.JDBCUtil.wrapAndThrowResourceException(JDBCUtil.java:203)
	at weblogic.jdbc.jts.Driver.newConnection(Driver.java:707)
	at weblogic.jdbc.jts.Driver.createLocalConnection(Driver.java:197)
	at weblogic.jdbc.jts.Driver.connect(Driver.java:155)
	at weblogic.jdbc.common.internal.RmiDataSource.getConnection(RmiDataSource.java:305)
	at weblogic.ejb20.cmp.rdbms.RDBMSPersistenceManager.getConnection(RDBMSPersistenceManager.java:2247)
...

und dann stuendlich...

Code:
In createCacheMap(): FinderException javax.ejb.FinderException: Couldn't get connection: 
weblogic.jdbc.extensions.PoolLimitSQLException: weblogic.common.resourcepool.ResourceLimitException: No resources currently available in pool myPool to allocate to applications, please increase the size of the pool and retry..
weblogic.jdbc.extensions.PoolLimitSQLException: weblogic.common.resourcepool.ResourceLimitException: No resources currently available in pool myPool to allocate to applications, please increase the size of the pool and retry..
	at weblogic.jdbc.common.internal.JDBCUtil.wrapAndThrowResourceException(JDBCUtil.java:203)
	at weblogic.jdbc.jts.Driver.newConnection(Driver.java:707)
	at weblogic.jdbc.jts.Driver.createLocalConnection(Driver.java:197)
	at weblogic.jdbc.jts.Driver.connect(Driver.java:155)
	at weblogic.jdbc.common.internal.RmiDataSource.getConnection(RmiDataSource.java:305)
	at weblogic.ejb20.cmp.rdbms.RDBMSPersistenceManager.getConnection(RDBMSPersistenceManager.java:2247)
...

Also ich habe noch nicht so viel mit dem TimerTask gearbeitet. Ich schaetze mal, dass ich irgendwo was loeschen/schliessen muesste und es halt nicht tu... Muss ich irgendwo ejbRemove aufrufen?

Bin fuer jede Idee dankbar!
THX B.
 
(per findAll() ), die dann etwas "bearbeitet" und in eine HashMap schreibt.
klarer Fall von Design kaputt

ich geh mal von Local-Homes und so aus, ist aber Remote genau so

=> mit findAll holst du dir eine Collection der Local-Interfaces

die enzelnen Objektinstanzen in dieser Collection sind LIVE, wenn du die alle in eine Hash-Map legst, sind effektiv alle Zugriffe auf den ganzen Schamott gesperrt?!

Wenn die Entities etwa mit Trasaktion REQUIRED laufen, wird eine Transaktion aufgemacht (und damit auch eine Datenbankverbindung) -> wenn du also diese Dinger nie wieder aufgibst wirds problematisch

wenn du ejbRemove auf einer Entity aufrufst, wird die in der Datenbank gelöscht, mach das lieber nicht...

Verwende ValueObjects, kopiere alle Einträge in der Collection und leg diese Kopien in deine HashMap!
 
Oh sorry, hatte ich vergessen zu sagen:

Also ich lege nicht die Objekte in der HashMap ab. Beim "bearbeiten" erzeuge ich mir zu jeder Instanz eine JavaBean. (Kopiere die Daten der EntityBean in eine JavaBean. Mit diesen JavaBeans arbeite ich dann auch und kopiere die in die Map. Sollte also nicht das Problem sein, oder?

Was mir auch gerade aufgefallen ist: es laeuft wieder - keine Ahnung warum. Ich habe den Server definitiv nicht restartet. Es ist also einfach von 10 Uhr abends bis 10 Uhr morgens - (hab' hier 'ne kleine Zeitverschiebung zu Deutschland) nicht gelaufen.
Arghhhhh... Das wird immer verrueckter. Muss dass aber natuerlich trotzdem irgendwie fixen - "Noe sorry Leute - das leuft jetzt die naechsten 12 Stunden halt mal nicht - iss halt so." - zaubert sicher meinem Chef nicht grad ein Laecheln auf's Gesicht...

Hat jemand 'ne Idee? Wie gesagt: bin fuer JEDE Idee dankbar... :bahnhof:
 
Irgendwo ein Leck, jemand schliesst eine Connection nicht

Ins Logfile schauen ob irgendwo Exceptions autauchen (ein erster anstatzpunkt)

Suche im code nach verschluckten Exceptions
Code:
catch(Exception e){}
und wenn du sowas findest, geh zum zuständiger Progger und verpass ihm ein paar Ohrfeigen

=> such mal nach BMP Entities oder Sessions, bei denen direkt mit der DB kommuniziert wird

oft ein conn.close() vergessen; oder man hat
Code:
...
    rs.getString(1);
    /// jetzt wilder Code
    conn.close()
...
=> wenn der wilde Code eine Ex wirft, dann wird conn.close() icht mehr aufgerufen (sollte immer in finally stehen)

wirf mal einen Profiler/Tracer auf der DB an und schau zu, welche Verbindungen wann aufgebaut werden [hilft aber oft nix, weil der Appserver einfach seinen pool aufbaut...]
 
Status
Nicht offen für weitere Antworten.

Zurück
Oben