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

时间:2010-02-21 22:54:51

标签: java derby shutdown in-memory-database

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

我无法弄清楚如何正确关闭(A quick look at the code) Derby数据库。我相信我让它适用于标准数据库但我在内存数据库中尝试类似代码时会遇到不同的异常。

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

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

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

然后:

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

前者导致an exception but not the one expected。详情如下:

  

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

后者导致

  

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

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

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

注意:我引用的示例是:WwdEmbedded ProgramJava Code)。

3 个答案:

答案 0 :(得分:20)

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

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

关闭整个系统,结果应为XJ015

答案 1 :(得分:12)

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实际删除内存数据库。 。请参阅release notes和页面Using in-memory databases

答案 2 :(得分:0)

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

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