1

当我通过 ORMLite 创建一个新的 H2 数据库时,会创建数据库文件,但是在我关闭我的应用程序后,它存储在数据库中的所有数据都将丢失:

JdbcConnectionSource connection =
   new JdbcConnectionSource("jdbc:h2:file:" + path.getAbsolutePath() + ".h2.db");
TableUtils.createTable(connection, SomeClass.class);
Dao<SomeClass, Integer> dao = DaoManager.createDao(connection, SomeClass.class);
SomeClass sc = new SomeClass(id, ...);
dao.create(sc);
SomeClass retrieved = dao.queryForId(id);
System.out.println("" + retrieved);

此代码将产生良好的结果。它将打印我存储的对象。但是,当我这次再次启动应用程序而不创建表和存储新对象时,我得到一个异常,告诉我所需的表不存在:

JdbcConnectionSource connection =
   new JdbcConnectionSource("jdbc:h2:file:" + path.getAbsolutePath() + ".h2.db");
Dao<SomeClass, Integer> dao = DaoManager.createDao(connection, SomeClass.class);
SomeClass  retrieved = dao.queryForId(id); // will produce an exception..
System.out.println("" + retrieved); 
4

2 回答 2

1

createTable如果我在关闭状态下运行一次然后第二次运行,则以下内容对我来说很好。第二次插入当然给了我主键违规,但这是意料之中的。它使用(如@Thomas 提到的)“.h2.db.h2.db”前缀创建了文件。

一些问题:

  1. 第一次运行应用程序后,您能看到path正在创建的文件吗?
  2. 它是在永久存储上,而不是在操作系统清除的某个临时位置上吗?
  3. 您的应用程序的其他部分是否有可能在数据库代码开始之前清除它?

希望这可以帮助。

@Test
public void testStuff() throws Exception {
    File path = new File("/tmp/x");
    JdbcConnectionSource connection = new JdbcConnectionSource("jdbc:h2:file:"
        + path.getAbsolutePath() + ".h2.db");
    // TableUtils.createTable(connection, SomeClass.class);
    Dao<SomeClass, Integer> dao = DaoManager.createDao(connection,
        SomeClass.class);
    int id = 131233;
    SomeClass sc = new SomeClass(id, "fopewjfew");
    dao.create(sc);
    SomeClass retrieved = dao.queryForId(id);
    System.out.println("" + retrieved);
    connection.close();
}

我可以从我家看到俄罗斯:

> ls -l /tmp/
...
-rw-r--r--  1 graywatson  wheel  14336 Aug 31 08:47 x.h2.db.h2.db
于 2011-08-31T12:54:56.287 回答
0

你关闭数据库了吗?它会自动关闭,但最好手动关闭(这样恢复速度会更快)。

在许多情况下,数据库 URL 是问题所在。您确定在这两种情况下都使用相同的路径吗?否则,您最终会得到两个数据库。对了,“.h2.db”是自动添加的,不需要手动添加。

为了更好地分析问题,您可以附加;TRACE_LEVEL_FILE=2到数据库 URL,然后在*.trace.db文件中检查对数据库执行了哪些 SQL 语句。

于 2011-08-31T09:30:19.990 回答