我正在Glassfish下开发一个JSF / JPA应用程序,它使用Derby(JavaDB)作为默认数据库。事实证明,持久性单元的“DROP AND CREATE”策略不能可靠地工作,因此我已经删除了数据库,然后在更改模式时重新创建它。
或者至少我在尝试。如果我删除了数据库,它将不允许我创建一个与删除数据库相同的“新”数据库。也不会让我打开旧的。
我现在的工作只是创建一个带有新名称的数据库并使用它(每次都必须编辑glassfish资源xml文件),但我想知道发生了什么。其他人有这个问题和/或知道如何解决它?
答案 0 :(得分:0)
我不是百分百肯定我明白这个问题的病理是什么,但我有一个解决方法。如果有人可以向Netbeans社区输入错误报告,或者给我一个指向它的链接,那将是件好事。
问题是在MacOS版本的NetBeans 7.2上创建的,其中管理着GlassFish 3.1服务器。当您启动服务器以运行您的应用程序时,它会自动启动Derby(Java DB)。但是,当您停止GlassFish服务器甚至退出Netbeans时,Derby安装仍会继续运行。
当你启动NetBeans&再次,GlassFish会注意到,当它试图启动Derby服务器时,它会抱怨端口1527已经在使用中。通常这不是问题,因为应用程序将继续运行并通过它保持打开的端口与先前启动的Derby进程通信。但是,我怀疑Netbeans菜单系统用于删除和创建数据库的通信路径不使用此数据路径,因此尝试对由进程保持打开的数据结构执行删除/创建操作它没有沟通。因此锁定和失败。
解决方法是在后台终止Derby进程,然后执行Delete / Create操作,它运行正常。在MacOS或Linux上,打开命令窗口并执行
ps axe | grep -i derby
你会发现一个运行Derby的java JVM。只需复制进程ID并执行
kill <pid>
(-9似乎没有必要)并再次执行ps命令,您应该看到该过程已经消失。德比将在下次需要时由Netbeans启动。