2

jar 内にある読み取り専用データベースに接続すると、アプリケーションを実行できますが、クエリを実行しようとすると、アプリケーションがフリーズします。何が間違っているのかわかりません。このガイドに従いました

これは私がデータベースに接続している方法です

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();  
}
4

1 に答える 1

2

これが私の簡単なセットアップです。必要な一時ディレクトリ プロパティを設定します。

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();
    }
}

tempDir の適切な場所は次のとおりです。

  • システムの一時ディレクトリ:System.getProperty("java.io.tmpdir")
  • あなたの作業ディレクトリ:"."
  • アプリのディレクトリ:ClassLoader.getSystemClassLoader().getResource(".").getPath()

またはそれに関連するもの;-)

これで問題が解決しない場合は、データベースを確認/再作成してください。jar をパッキングする前に十分にシャットダウンしなかった場合、derby は起動時に常にリカバリーを試みます。

于 2012-06-23T22:15:04.107 に答える