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

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

我无法弄清楚的是如何正确关闭(快速查看代码) Derby数据库。 我相信我让它适用于标准数据库但我在内存数据库中尝试类似代码时会遇到不同的exception。

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

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

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

然后:

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

前者导致exception但不是预期的exception 。 细节是:

java.sql.SQLNonTransientConnectionException:数据库’内存:呃’关闭。

后者导致

java.sql.SQLException:找不到数据库’呃’。

基于我能够弄清楚的,我们想要一个SQLException而不是我们收到的那个。 另一方面, SQLNonTransientConnectionException错误似乎更合适,但不是正确的类型(虽然它是从SQLException派生的),也没有正确的状态代码。 州代码最终为: 08006

我的示例代码说明了一个SQL状态为“XJ015”的SQLException

注意:我引用的示例是: WwdEmbedded Program ( Java Code )。

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

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

关闭整个系统,应该产生XJ015

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”forms的URL实际删除内存数据库。 请参阅发行说明和使用内存数据库的页面。

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

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