我正在编写一些使用Java DB(即Apache Derby)作为数据库的Java应用程序。我使用以下方法连接到数据库:
Connection getConnection() throws SQLException {
EmbeddedDataSource ds = new EmbeddedDataSource();
ds.setDatabaseName(dbUri);
ds.setPassword(password);
ds.setUser(username);
Connection conn = ds.getConnection();
conn.setSchema(schema);
return conn;
}
这样可以,但有时我得到以下异常:
java.sql.SQLException: Another instance of Derby may have already booted the database
当我运行我的应用程序并且 SQuirreL SQL Client 连接到我的数据库时,会发生这种情况。所以一切都按预期工作,但我希望能够在我的getConnection()
方法中检查这一点。换句话说,我想检查是否有任何会话打开到我的数据库,例如,关闭它们,抛出我自己的异常或显示错误对话框。我不知道该怎么做。
THX
答案 0 :(得分:0)
您可以使用“try”块来捕获SQLException,然后检查异常并确定它是否是“Derby的另一个实例”异常,而不是声明您的应用程序“抛出SQLException”。
然后,您可以相应地从“getConnection”方法中抛出自己的异常。
答案 1 :(得分:0)
我将getConnection()
方法修改为如下所示。它做我想要的:
Connection getConnection() throws SQLException, DAOConnection {
EmbeddedDataSource ds = new EmbeddedDataSource();
ds.setDatabaseName(dbUri);
ds.setPassword(password);
ds.setUser(username);
Connection conn = null;
try {
conn = ds.getConnection();
} catch (SQLException e) {
// check if cannot connect due to "Another instance of
// Derby may have already booted the database".
// The error code of this exception is 45000.
if (e.getNextException().getErrorCode() == 45000) {
throw new DAOConnection(e.getNextException().getMessage());
}
throw new SQLException(e);
}
conn.setSchema(schema);
return conn;
}
答案 2 :(得分:0)
预防胜于治疗。 IMO,捕获异常,然后意识到它是重复的Derby服务器启动不是一个理想的设计。更好的是防止重复实例化。如果可能,您可以同步getConnection()
方法或使其成为单例类的一部分,或者从启动/主类的静态初始化程序块加载嵌入式Derby驱动程序它只被JVM加载一次,因此Derby只会启动一次。主要/启动类中的后续操作应该可以解决这个问题:
static {
try {
Class.forName("org.apache.derby.jdbc.EmbeddedDriver");
}
catch(Exception e){
.....
}
}
根据这里的链接http://db.apache.org/derby/docs/10.3/devguide/tdevdvlp38381.html加载驱动程序应该启动Derby嵌入式系统。