1

我正在 Glassfish 下开发一个 JSF/JPA 应用程序,它使用 Derby (JavaDB) 作为它的默认数据库。事实证明,持久性单元的“DROP AND CREATE”策略不能可靠地工作,所以我已经开始删除数据库,然后在我更改架构时重新创建它。

或者至少我正在努力。如果我删除数据库,它不会让我创建一个与已删除数据库相同时间的“新”数据库。它也不会让我打开旧的。

我现在的工作只是创建一个具有新名称的数据库并使用它(每次都必须编辑 glassfish 资源 xml 文件),但我想知道发生了什么。还有其他人有这个问题和/或知道如何解决吗?

4

1 回答 1

0

我不是 100% 确定我理解这个问题的病理是什么,但我有一个解决方法。如果有人可以向 Netbeans 社区提交错误报告或给我一个链接来做这件事,那就太好了。

该问题是在 MacOS 版本的 NetBeans 7.2 上产生的,GlassFish 3.1 服务器在其管理下。当您启动服务器以运行您的应用程序时,它会自动启动 Derby(Java DB)。但是,当您停止 GlassFish 服务器甚至退出 Netbeans 时,Derby 安装将继续运行。

当您再次启动 NetBeans & GlassFish 时,您会注意到当它尝试启动 Derby 服务器时,它会抱怨端口 1527 已在使用中。通常这不是问题,因为应用程序将继续运行并通过它保持打开的端口与先前启动的 Derby 进程通信。但是,我怀疑 Netbeans 菜单系统用于删除和创建数据库的通信路径不使用此数据路径,因此尝试对由进程保持打开的数据结构执行删除/创建操作它不是在交流。因此锁定和失败。

解决方法是在后台杀死 Derby 进程,然后执行删除/创建操作,它工作正常。在 MacOS 或 Linux 上,打开命令窗口并执行

ps axe | grep -i derby

你会发现一个运行 Derby 的 java JVM。只需复制进程 ID 并执行

kill <pid>

(-9 似乎不是必需的)并再次执行 ps 命令,您应该会看到该过程已消失。Derby 将在下次需要时由 Netbeans 启动。

于 2012-10-01T20:31:22.490 回答