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 回答