# java.sql.SQLException: out of memory



## mephi (6. Sep 2007)

Ich hab mal eine Frage..

zu Testzwecken, habe ich mal 15000 tables in meine DB eingetragen. aber bei der Methode getColumns von DatabaseMetaData bekomm ich eine SQLException: out of memory

verkraftet die Methode nicht soviele tables oder kann ich die abfrage irgendwie besser designen?


```
ResultSet rsFields = m_dbmd.getColumns(null, null, tableName, "%");
```

tablename ist PROFESSOR1 bis PROFESSOR15000 mit jeweils ca 10 feldern.


----------



## SlaterB (6. Sep 2007)

15.000 Tables mit einer gewissen Menge an Columns können doch durchaus die 64 MB Standard-Speicher sprengen,
was ist jetzt groß die Frage?


----------



## mephi (6. Sep 2007)

ob man das durch ein besseres design umgehen kann bzw ob es eine andere methode gibt?


----------



## SlaterB (6. Sep 2007)

wofür denn?
15.000 laden -> Error
nicht 15.000 laden -> kein Error

insofern is es ein besseres Design, die 15.000 nicht zu laden, ja

oder sprichst du von irgendeiner speicherschonenderen Darstellung? was soll man groß sagen wenn du an Information gibtst
'lade viele Daten -> Error'


----------



## mephi (6. Sep 2007)

ja ich such eine speicherschonende darstellung. mit DB hatte ich noch nicht wirklich viel zutun. 

die test tables haben alle 8 colums

irgendwie muss es doc auch möglich sein viel größere datenbanken nach einer table zu durchsuchen. oder kommt sowas nicht vor? ich hatte noch nie einblick in die DBs von irgendwelchen firmen


----------



## SlaterB (6. Sep 2007)

wenn du nicht alle Daten gleichzeitig brauchst, dann lade sie in Schritten,

15.000 Tabellen zu laden, um in einer Datenbank 'nach einer table zu durchsuchen', erscheint generell fragwürdig

mehr kann man ohne Informationen von dir immer noch kaum sagen


----------



## mephi (6. Sep 2007)

was für informationen brauchst du denn?
also das tool soll möglichst für alle datenbanken einsetzbar sein. unabhängig vom inhalt.

ich dachte ja am anfang dass das getColums nicht alle tabellen läd, sondern die datenbank nach der passenden tabelle bzw den passenden tabellen durchsucht. aber leider ist dem ja nicht so.


----------



## Murray (6. Sep 2007)

Vielleicht ist ja das Datenbank-Design das Problem - welche ernsthafte Datenbank hat denn wirklich 15.000 Tabellen?


----------



## mephi (6. Sep 2007)

Ich bin einfach mal von einer großen Anzahl ausgegangen. Aber wenn du meinst, dass sowas eigentlich nicht vorkommt, dann kann ich mir das auch sparen und mich mit zB 2k-5k zufrieden geben


----------



## DP (6. Sep 2007)

teste mal


```
ResultSet rs = s.executeQuery("describe tabelle");
       
while(rs.next()){
  System.out.println(rs.getString(1));
}
```


----------



## SlaterB (7. Sep 2007)

mephi hat gesagt.:
			
		

> was für informationen brauchst du denn?


z.B. die ein wahre, einzig wichtige Info bei allem auf der Welt: was ist das Ziel, was soll erreicht werden,
wenn man das weiß, DANN kann man anfangen über einen sinnvollen Weg dahin nachzudenken


----------



## DP (7. Sep 2007)

der will die spalten der vorhandenen tabellen auslesen


----------



## FenchelT (7. Sep 2007)

DP hat gesagt.:
			
		

> teste mal
> 
> 
> ```
> ...



Hallo DP,

ich glaube, das wird ihm nicht viel bringen; er will ja das es auf allen DBMS laeuft.
MSSQL kennt z.B. den describe Befehl nicht


----------



## mephi (7. Sep 2007)

Das ganze ist ein SQLGenerator der in einem größeren Framework verwendet werden soll.

Die Abfragen werden auf einer HP eingegeben. Um bei vielen Abfragen Fehler zu vermeiden, schreib ich den SQLGenerator. Man sagt zB sql.copy("mytable", "id", "neue id");
und dann liest der generator entweder aus dem cache oder aus der DB die nötige tabelle aus und generiert den sql code dafür

das wars im groben..


----------



## SlaterB (7. Sep 2007)

nichts davon klingt nach '15.000 Tabellen laden',

was hat dieses Problem, SQL für eine einzelne Tabelle zu generieren, mit '15.000 Tabellen laden' zu tun?

ist diese Frage so undenkbar?


----------



## mephi (7. Sep 2007)

Wenn ich wüsste wie ich nur eine laden kann..

Der Generator brauch ja die Spaltennamenm je nachdem welchen sql befehl er generieren soll.. 
unteranderem werden von einer anderen klasse auch eingabefelder generiert, passend zur tabelle die man sich aussucht. um zB ein insert zu ermöglichen


----------



## SlaterB (7. Sep 2007)

was spricht dagegen, nur die Spaltenamen der EINEN Tabelle zu laden statt der ALLER 15.000?

in 
ResultSet rsFields = m_dbmd.getColumns(null, null, tableName, "%");
kannst du doch die Tabelle angeben an Stelle von %?

edit: ne, du hast ja schon tableName davor ,
also du hast ein Anfrage auf eine bestimmte Tabelle, bekommst aber alle 15.000 Tabellen?
aha, eine neue Information


----------



## mephi (7. Sep 2007)

das nehm ich an. werde mir jetzt mal den quellcode raussuchen.

aber anders kann ich mir die fehlermeldung nicht erklären.

edit:
ach was wohl wichtig ist. teste das ganze auf einer hsqldb


----------



## mephi (11. Sep 2007)

Konnte das ganze jetzt auf einer mssql datenbank testen. da läuft das ohne probleme und ist sogar richtig schnell.

dann liegt das wohl an den treibern für die hsqldb?


----------

