Avatar billede madiedk Nybegynder
12. september 2008 - 15:22 Der er 12 kommentarer og
1 løsning

fejlmeddelse "Der kan ikke åbnes flere tabeller"

jeg får følgende fejlmeddelse når jeg kører mit java program
"Der kan ikke åbnes flere tabeller"

det er denne metode jeg kører ca 300 gange fra en anden metode.
fejlen kommer efter ca 150 gange løkken er kørt.

public void opslag(String afdeling) throws SQLException {
   
    sletAltDataArray();
    Application.afdeling = afdeling;
    Database.omkostningsBeløb();
    Database.hensættelsesInfo();
    Database.hensættelsesInfo.beforeFirst();
    antalOmkostninger = 0;
    række = 0;
    while(Database.hensættelsesInfo.next()){
   

        altData[række][0] = Database.hensættelsesInfo.getLong(6);
        altData[række][1] = Database.hensættelsesInfo.getLong(7);
        altData[række][2] = Database.hensættelsesInfo.getString(1);
        altData[række][3] = findOmkostning(); 
        altData[række][4] = Database.hensættelsesInfo.getDate(2);
        altData[række][5] = Database.hensættelsesInfo.getShort(3);       
        altData[række][6] = Database.hensættelsesInfo.getInt(4);
       

    antalOmkostninger = antalOmkostninger+1;
    række = række + 1;
 
}


}
Avatar billede arne_v Ekspert
13. september 2008 - 19:12 #1
Hvis jeg skal gaette, saa skyldes fejlen, at du ikke faar close't din database
Connection.
Avatar billede arne_v Ekspert
13. september 2008 - 19:13 #2
public void opslag(String afdeling) throws SQLException {
 
    sletAltDataArray();
    Application.afdeling = afdeling;
    Database.omkostningsBeløb();
    Database.hensættelsesInfo();
    Database.hensættelsesInfo.beforeFirst();
    antalOmkostninger = 0;
    række = 0;
    while(Database.hensættelsesInfo.next()){
 

        altData[række][0] = Database.hensættelsesInfo.getLong(6);
        altData[række][1] = Database.hensættelsesInfo.getLong(7);
        altData[række][2] = Database.hensættelsesInfo.getString(1);
        altData[række][3] = findOmkostning();
        altData[række][4] = Database.hensættelsesInfo.getDate(2);
        altData[række][5] = Database.hensættelsesInfo.getShort(3);     
        altData[række][6] = Database.hensættelsesInfo.getInt(4);
     

    antalOmkostninger = antalOmkostninger+1;
    række = række + 1;

}

Database.minmetodesomlukkerconnection(); // <-----------------

}
Avatar billede arne_v Ekspert
13. september 2008 - 19:13 #3
static metoder er ioevrigt noget skidt !
Avatar billede madiedk Nybegynder
14. september 2008 - 09:48 #4
okay, problemet er at "public void opslag(String afdeling)" metoden bliver kørt 300 gange så hvis jeg lukker forbindelsen hver gang jeg har kørt den skal jeg åbne og lukke den 300 gange det virker forkert. jeg har også prøvet at lukke mine resultset efter hver gang "public void opslag(String afdeling)" har kørt, men det hjælpen ikke.

jeg kan godt prøve at lave metoder ikke static og se om det hjælper?
Avatar billede arne_v Ekspert
14. september 2008 - 12:57 #5
Hvis du gerne vil holde connection aaben, saa luk ihvertfald statement og result set.
Avatar billede madiedk Nybegynder
14. september 2008 - 13:21 #6
okay, men siden at alle min databaseforespørgseler er i static metoder så bliver de vel lukket når de færdige, ja det ville det vel også selvom de ikke var static. jeg har googlet Cannot Open Any More Tables og fundet en masse, men dog ikke en løsning, men det serud somom det er en slags bug måske!?
Avatar billede arne_v Ekspert
14. september 2008 - 13:27 #7
Nej.

ResultSet, *Statement og Connection skal alle lukkes eksplicit.
Avatar billede madiedk Nybegynder
14. september 2008 - 13:46 #8
det jeg har gjort nu er at lukke min connection efter hver forespørgsel og så kommer den fejl ik og jeg kan ikke se nogle hastighedsændring. men det virker somom udfra det jeg læser på google at fejler referer til at access kun kan have 1024 tableID af gangen og det kan ikke vides hvor mangel den bruges til en forespørgsel. så hvis man ikke nulstiller dem ved f.eks. at lukke connection så tæller den bare op og når den rammer 1024 kommer fejlen.
jeg kan lukke mine resultset da det er klasse variabler da jeg skal bruge dem fra andre metoder, men mine statement det er lokalvariabler så dem kan jeg ikke lukke eksplicit da jeg så mister mit resultset
Avatar billede arne_v Ekspert
14. september 2008 - 15:37 #9
Maaske skulle du lade Statement foelge ResultSet saa du kan close dem begge.

Men det er nok connection som er problemet.

JDBC-ODBC bridge er noget skidt !
Avatar billede madiedk Nybegynder
14. september 2008 - 16:58 #10
okay, det kan jeg prøve, men har målt med profiling at det at åbne og lukke connection hver gang kun tager 1-2 procent af den samlene tid så det kan jeg godt leve med.
er der andre måder jeg kan connecte til en access database uden at bruge
JDBC-ODBC bridge altså Class.forName("sun.jdbc.odbc.JdbcOdbcDriver")
Avatar billede arne_v Ekspert
14. september 2008 - 17:16 #11
Det tror jeg paa.

Nej. Desvaerre har MS ikke lavet en JDBC driver til Access.

Stort set alle databaser er derfor bedre end Access til Java brug.
Avatar billede madiedk Nybegynder
14. september 2008 - 17:34 #12
okay så konklusionen på mit problem må være at java og access ikke er gode sammen er bl.a pga JDBC-ODBC bridge.
og at fejlen "Der kan ikke åbnes flere tabeller" kan undgåes ved at åbne og lukke connection inden der bliver lavet for mange forespørgsler i den samme connectionsession.
smid et svar arne_v og tak igen for hjælpen. kan du desuden svarer mig på hvor jeg finder driveres til at forbinde java med en oracle database? jeg har ledt meget men kan ikke finde den?
Avatar billede arne_v Ekspert
14. september 2008 - 17:55 #13
De kommer ihvertfald sammen med Oracle databasen.

Men ellers kan de hentes her:
  http://www.oracle.com/technology/software/tech/java/sqlj_jdbc/index.html

Hvis du gerne vil koere noget der bruger database uden adgang til Oracle, saa
kan du bruge en af de smaa embedded Java database - Derby (kommer med Java 1.6 som
Java DB), HSQLDB (er database engine i OpenOffice) etc..

Og svar.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester