alleen-lezen derby database bevriezen

When I make a connection to my read only database, which is now inside of a jar, I can run the application, but when I try to run a query, it freezes the application. I'm not sure what I'm doing wrong, I followed this guide

Dit is hoe ik verbinding maak met de database

try
{  
    Class.forName("org.apache.derby.jdbc.EmbeddedDriver").newInstance();
    connection = DriverManager.getConnection("jdbc:derby:jar:(database.jar)MyDbTest;");
    statement = connection.createStatement();
}
catch (Exception e) 
{  
    e.printStackTrace();  
}
2
@Sascha dat is waarschijnlijk ... hoe zou ik de map instellen direct buiten het jar-bestand? Ik wil dat dit werkt op Windows en Mac, dus ik wil het niet ergens als C://of/usr of iets dergelijks plaatsen.
toegevoegd de auteur Mukhi, de bron
heeft u de eigenschappen "derby.storage.tempDirectory" en "derby.stream.error.file" ingesteld op een beschrijfbare tijdelijke map?
toegevoegd de auteur Sascha, de bron

1 antwoord

Dus hier is mijn eenvoudige setup, waar ik de nodige temp dir-eigenschappen instelde.

private static void accessReadOnlyJar() {
    try {
        Class.forName("org.apache.derby.jdbc.EmbeddedDriver").newInstance();
        Properties props = new Properties();
        String tempDir = System.getProperty("java.io.tmpdir");
        props.setProperty("derby.storage.tempDirectory", tempDir);
        props.setProperty("derby.stream.error.file", tempDir+"derby_error.log");
        Connection connection = DriverManager.getConnection("jdbc:derby:jar:(data/db.jar)derbyDB", props);

        Statement statement = connection.createStatement();
        ResultSet result = statement.executeQuery("SELECT * FROM TESTTABLE");
        while(result.next()){
            System.out.println(result.getString("NAME"));
        }

        connection.close();
    } catch (InstantiationException e) {
        e.printStackTrace();
    } catch (IllegalAccessException e) {
        e.printStackTrace();
    } catch (ClassNotFoundException e) {
        e.printStackTrace();
    } catch (SQLException e) {
        e.printStackTrace();
    }
}

goede locaties voor uw tempDir kunnen zijn:

  • the Systems temp dir: System.getProperty("java.io.tmpdir")
  • your working directory: "."
  • your apps directory: ClassLoader.getSystemClassLoader().getResource(".").getPath()

of iets daar op betrekking hebbend ;-)

Als dit uw probleem niet oplost, controleer/maak uw database opnieuw aan. Als het niet was afgesloten ruim voordat je je pot hebt ingepakt, zal derby altijd een herstel proberen bij het opstarten.

2
toegevoegd
Ik veronderstel dat mijn database niet correct werd afgesloten, maar ik deed precies wat er in de gids stond en gebruikte dezelfde opties voor de opdracht terminal. Om het even welke ideeën?
toegevoegd de auteur Mukhi, de bron
om uw db af te sluiten, verbindt u alle transacties en roept u DriverManager.getConnection ("jdbc: derby: MyDbTest; shutdown = tr & zwnj; ue"); zie: DerbyTut
toegevoegd de auteur Sascha, de bron