如何正确关闭Derby内存数据库

16
我正在使用Derby作为嵌入式数据库。此外,我正在使用其内存数据库选项进行单元测试。
我无法弄清楚如何正确关闭Derby数据库(快速查看代码)。我相信我已经将其用于标准数据库,但在尝试在内存数据库上执行类似代码时,我遇到了不同的异常。
我将省略细节,如果需要,我会添加它们。
基本上,我正在尝试以这两种方式关闭我的数据库,其中我的内存数据库始终称为“eh”:
DriverManager.getConnection("jdbc:derby:memory:eh;shutdown=true");

然后:
DriverManager.getConnection("jdbc:derby:eh;shutdown=true");

前者会导致异常,但不是预期的那个。详细信息如下:

java.sql.SQLNonTransientConnectionException: Database 'memory:eh' shutdown.

后者会导致

java.sql.SQLException: Database 'eh' not found.

根据我所了解到的,我们希望得到一个SQLException,但不是我们收到的那个。另一方面,SQLNonTransientConnectionException错误似乎更合适,但它不是正确的类型(尽管它派生自SQLException),也没有正确的状态代码。状态代码最终变成: 08006

我所拥有的示例代码说明了具有SQL状态为"XJ015"的SQLException

注意:我参考的示例是:WwdEmbedded程序Java代码)。


使用drop而不是shutdown似乎是你想要的。shutdown似乎不能删除数据库。 - Bruno Medeiros
3个回答

21

XJ015 (带SQLCODE 50000) 是系统完全关闭时的预期(成功) SQLSTATE, 另一方面,08006 (带SQLCODE 45000)是仅关闭单个数据库时预期的SQLSTATE

DriverManager.getConnection("jdbc:derby:;shutdown=true");

关机整个系统,并应该导致 XJ015 错误。


14

URL "jdbc:derby:memory:eh;shutdown=true" 会出现预期的08006错误代码,但实际上并不会从内存中删除数据库。如果稍后尝试使用"jdbc:derby:memory:eh;create=true"创建新数据库,则会出现错误,指示数据库已经存在。

幸运的是,在Derby 10.6.1.0(于2010年5月17日发布)中,可以使用形如"jdbc: derby:memory:eh;drop=true"的URL来实际删除内存中的数据库。请参见发布说明和页面“在内存中使用数据库”


0

我相信你的第一个代码示例是正确的。你看到的SQL状态差异,我认为是因为你正在运行Derby嵌入式,但你看到的示例代码(带有SQL状态XJ015)是在客户端-服务器配置中运行的。

正如你所指出的,SQLNonTransientConnectionException是SQLException的子类,所以我很困惑为什么你认为你没有得到正确类型的异常。


谢谢您的回复。最终我得出了与您相同的结论,但除了您的认可之外,我仍然没有证据证明它是正确的。我甚至尝试搜索了Derby源代码。我参考的示例是WwdEmbedded.java,这是一个嵌入式示例。此外,文档指出应该期望SQLException...而不是SQLException或其子类。话虽如此,我接受这个可能性,这也是我首先提到关系的原因。 - Frank V

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接