2

我使用 play 2.0.1 开发小型应用程序,发现使用内部 H2 数据库进行客户预览非常有用。数据库中只有几行和一两个用户。在我的笔记本电脑中编译应用程序并制作 tar 以部署在测试服务器上非常方便。但看起来 H2 有时会下降。我在我的 application.log 中找到了这个:

!@6anj14ljo - 内部服务器错误,请求 [POST /admin] ->

play.core.ActionInvoker$$anonfun$receive$1$$anon$1:执行异常 [[PersistenceException:查询抛出 SQLException:未找到表“MANAGER”。

我知道使用 H2 进行生产不是一个好主意。但是我不想每次都配置mysql。这种H2行为的原因是什么?

4

2 回答 2

5

用于h2-browser检查数据库的状态,以及结构是否与例外相同:

在终端/命令行中

  1. play
  2. h2-browser- 它将h2-browser在新的浏览器窗口中打开
  3. ~run
  4. 进行进化
  5. 转到窗口并使用与您提供的h2-browser相同路径进行连接application.confdb.default.url

另一方面,与您相反,我发现在开发和生产模式下使用不同的数据库可能很烦人。每个数据库引擎都有一些非常具体的事情,您需要解决一些问题两次,一次用于H2- 稍后用于MySQL. 这没有意义,更糟糕的是,每次在开发模式下重新启动应用程序时,都需要再次填充样本数据以进行调试。也许在重新启动之间您忘记添加一些记录等。

虽然最后一个问题可以通过在方法中使用Global 对象onStart()插入同一组测试数据来解决,但在重启之间将测试数据保留在 MySQL 中会更舒服。

当然,如果您仍然想要/需要使用H2,您也可以通过从 url 中file mode删除mem段来使用它,然后它将被持久化在磁盘上。

于 2012-06-25T10:39:38.850 回答
0

您是否将数据库配置为在没有连接的情况下不删除表?从文档中可以看出,您必须DB_CLOSE_DELAY=-1在配置文件中附加到您的 db url 以防止此类行为。

当我在 docker 容器中运行带有内存数据库的“生产”应用程序时,我遇到了与您相同的错误。在我运行它而不与它交互一段时间后,这些表将被删除。

附加DB_CLOSE_DELAY=-1标志似乎已修复它

于 2014-08-08T11:49:19.733 回答