ISAM error: too many files open

Status
Nicht offen für weitere Antworten.

foobar

Top Contributor
Hallo,

ich arbeite gerade an einer Anwendung die per JDBC auf eine Informix-DB zugreift. Das Problem ist, daß ich reproduzierbar nach einer bestimmten Anzahl von geschriebenen Datensätzen folgende Exception bekomme:

Could not open database table (mydb.myTable)
caused by:
ISAM error: too many files open

In meiner Software verwende ich viele PreparedStatemens und ich weiß, daß ich nicht alle schliesse nachdem diese nicht mehr verwendet werden. Kann das diesen Fehler verursachen? Ist das ein Problem, wenn man die PreparedStatements und ResultSets nicht schliesst?

Viele Grüße,
foobar
 
Was sagt die DB-Doku zu der Fehlermeldung?

Ich könnte mir vorstellen, dass es ein Limit des OS ist. Wenn es ne Linux/Unix Karre ist, such mal nach Doku zu ulimit. Da dürfte es aber auch Empfehlungen seitens des DB-Herstellers geben. Mach dann mal ein cat /proc/sys/fs/file-max
 
Erstmal Danke für eure Antworten.

Ja, es ist ein Linuxsystem.

104 ISAM error: too many files open.
The ISAM processor has reached its limit of open files. For C-ISAM programs, review the program logic and change it so that fewer files are open concurrently. Use isclose to close unneeded files. For SQL products, this query is too complex; it uses too many tables concurrently. Perform the query in steps, and use temporary tables.
Also auf meinem Rechner kriege ich als Ausgabe der file-max: 205711 und auf dem Rechner auf dem die DB läuft sind es nur 16284. Da ist schon ein kleiner Unterschied.

So, ich bin mal den Code durchgegangen und habe ein paar finally-Statements eingefügt in denen ich die Preparedstatements geschlossen habe. Dadurch hat sich der Fehler etwas nach hinten geschoben d.h. es dauert etwas länger bis der Fehler auftritt. Das ist ja schon mal ein Hinweis darauf, daß der Fehler auf die PreparedStatements zurück zu führen ist.
Kann man die Anzahl der max-files einfach so hoch setzen oder kann das zu problemen führen?
 
Die Queries sind ziemlich simpel, das ist nicht das Problem. Ich hab jetzt mal überall finally-Blöcke eingebaut *ächzi* und anscheinend läuft es jetzt. Aber merwürdig finde ich das ganze schon. Das ist ja nicht meine erste DB-Anwendung in Java und ich habe mich bisher nie um das Schliessen der PreparedStatements sorgen müssen. Vielleicht liegt hängt das auch mit dem JDBC-Treiber zusammen oder mit Informix. Hat jemand schon mal ähnliche Erfahrungen gemacht?
 
Status
Nicht offen für weitere Antworten.

Zurück
Oben