16

我使用 derby 作为嵌入式数据库。此外,我正在使用它的内存数据库选项进行单元测试。

我不知道如何正确关闭(快速查看代码) Derby 数据库。我相信我可以将它用于标准数据库,但是在内存数据库上尝试类似代码时会遇到不同的异常。

我将省略细节,如果需要其他感觉,我会添加它们。

基本上,我试图以这两种方式关闭我的数据库,其中我的内存数据库一直被称为“eh”:

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

然后:

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

前者导致异常,但不是预期的。详情如下:

java.sql.SQLNonTransientConnectionException:数据库“内存:eh”关闭。

后者导致

java.sql.SQLException:找不到数据库“eh”。

根据我能够弄清楚的情况,我们想要一个SQLException但不是我们收到的那个。另一方面,SQLNonTransientConnectionException错误似乎更合适,但不是正确的类型(尽管它是从 派生的SQLException),也没有正确的状态代码。状态代码最终是:08006.

我的示例代码说明SQLException了 SQL 状态为“XJ015”的情况。

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

4

3 回答 3

21

XJ015(带有SQLCODE50000)是SQLSTATE完全系统关闭的预期(成功)。另一方面, 08006(带有SQLCODE45000)是SQLSTATE仅关闭单个数据库的预期值。

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

关闭整个系统并应导致XJ015.

于 2010-04-06T23:25:11.570 回答
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 来删除内存数据库。请参阅发行说明和页面使用内存数据库

于 2010-08-15T22:13:19.003 回答
0

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

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

于 2010-02-26T05:41:51.603 回答