HSQL连接异常,连接不存在
HSQL connection exception, connection does not exist
我遇到了非常不明确的异常 connection exception : connection does not exist
,我花了很多时间才找到它的来源。我一直在搜索 HSQLDB 文档及其邮件列表、Whosebug 等。最近我找到了异常的实际原因。
在我的 jdbc 项目中,我想从 HSQLDB 获取自动生成的 invoiceID
,但是当我尝试这样做时,结果是可以的,但在那之后,当我 运行另一个读取或更新数据库中某些内容的查询我得到了这个异常。我已经观察这个问题三个星期了。现在我发现 getInvoiceID()
方法是导致它的原因。当我评论这个方法时,项目 运行 很好,但是在任何时候调用这个函数都会阻止进一步调用 jdbc.
我尝试使用替代方法从发票中检索自动生成的字段table,但问题仍然存在。
public static int getInvoiceID() {
int invoiceID = -1;
try ( Statement stmt = DatabaseManager.getInstance().getConnection()
.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_READ_ONLY);
ResultSet res = stmt.executeQuery("SELECT COUNT(*) FROM INFORMATION_SCHEMA.SYSTEM_SESSIONS");) {
if(res.next())
invoiceID = res.getInt(1);
else
invoiceID = 1;
} catch (SQLException e) {
System.err.println("getInvoiceID Exception: " + e.getMessage());
}
return invoiceID;
}
以上方案参考自
public static int getInvoiceID() {
int invoiceID = -1;
try ( Statement stmt = DatabaseManager.getInstance().getConnection()
.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_READ_ONLY);) {
stmt.executeQuery("INSERT INTO Invoice VALUES (NULL, NULL, NOW(), NULL);");
try (ResultSet result = stmt.executeQuery("CALL IDENTITY();")) {
if(result.next())
invoiceID = result.getInt(1);
} catch( SQLException e){
e.printStackTrace();
}
} catch (SQLException e) {
System.err.println("getInvoiceID Exception: " + e.getMessage());
}
return invoiceID;
}
我也尝试了 generated keys
的解决方案
昨天准备post这道题的时候发现异常是因为我用了ResultSet.TYPE_FORWARD_ONLY
然后改成ResultSet.TYPE_SCROLL_INSENSITIVE
终于解决了。但现在我非常确定这个异常是由方法 getInvoiceID()
引起的,并由下一个试图访问数据库的函数调用抛出。
这是我的 table
CREATE TABLE IF NOT EXISTS Invoice(
InvoiceID INT GENERATED BY DEFAULT AS IDENTITY(START WITH 1) PRIMARY KEY,
ClientID VARCHAR(4),
Entry DATETIME NOT NULL,
TotalAmount DECIMAL(10,2) DEFAULT 0,
FOREIGN KEY (ClientID) REFERENCES Client(ClientID)
);
异常:
java.sql.SQLNonTransientConnectionException: connection exception: connection does not exist
at org.hsqldb.jdbc.JDBCUtil.sqlException(Unknown Source)
at org.hsqldb.jdbc.JDBCUtil.sqlException(Unknown Source)
at org.hsqldb.jdbc.JDBCUtil.sqlException(Unknown Source)
at org.hsqldb.jdbc.JDBCUtil.connectionClosedException(Unknown Source)
at org.hsqldb.jdbc.JDBCConnection.checkClosed(Unknown Source)
at org.hsqldb.jdbc.JDBCConnection.prepareStatement(Unknown Source)
at database.ProductManager.getProductByID(ProductManager.java:203)
at gui.InvoicePanel.actionPerformed(InvoicePanel.java:423)
at javax.swing.AbstractButton.fireActionPerformed(Unknown Source)
at javax.swing.AbstractButton$Handler.actionPerformed(Unknown Source)
at javax.swing.DefaultButtonModel.fireActionPerformed(Unknown Source)
at javax.swing.DefaultButtonModel.setPressed(Unknown Source)
at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(Unknown Source)
at java.awt.Component.processMouseEvent(Unknown Source)
at javax.swing.JComponent.processMouseEvent(Unknown Source)
at java.awt.Component.processEvent(Unknown Source)
at java.awt.Container.processEvent(Unknown Source)
at java.awt.Component.dispatchEventImpl(Unknown Source)
at java.awt.Container.dispatchEventImpl(Unknown Source)
at java.awt.Component.dispatchEvent(Unknown Source)
at java.awt.LightweightDispatcher.retargetMouseEvent(Unknown Source)
at java.awt.LightweightDispatcher.processMouseEvent(Unknown Source)
at java.awt.LightweightDispatcher.dispatchEvent(Unknown Source)
at java.awt.Container.dispatchEventImpl(Unknown Source)
at java.awt.Window.dispatchEventImpl(Unknown Source)
at java.awt.Component.dispatchEvent(Unknown Source)
at java.awt.EventQueue.dispatchEventImpl(Unknown Source)
at java.awt.EventQueue.access0(Unknown Source)
at java.awt.EventQueue.run(Unknown Source)
at java.awt.EventQueue.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(Unknown Source)
at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(Unknown Source)
at java.awt.EventQueue.run(Unknown Source)
at java.awt.EventQueue.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(Unknown Source)
at java.awt.EventQueue.dispatchEvent(Unknown Source)
at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source)
at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
at java.awt.EventDispatchThread.run(Unknown Source)
Caused by: org.hsqldb.HsqlException: connection exception: connection does not exist
at org.hsqldb.error.Error.error(Unknown Source)
at org.hsqldb.error.Error.error(Unknown Source)
... 42 more
问题出在 Connection
我修改了我的代码并在执行任何 SQL 后关闭了 connection
。这解决了我的问题如下:
// getConnection() returns new connection if null
DatabaseManager.getInstance().getConnection();
/*
* SQL
*/
DatabaseManager.getInstance().close();
我遇到了非常不明确的异常 connection exception : connection does not exist
,我花了很多时间才找到它的来源。我一直在搜索 HSQLDB 文档及其邮件列表、Whosebug 等。最近我找到了异常的实际原因。
在我的 jdbc 项目中,我想从 HSQLDB 获取自动生成的 invoiceID
,但是当我尝试这样做时,结果是可以的,但在那之后,当我 运行另一个读取或更新数据库中某些内容的查询我得到了这个异常。我已经观察这个问题三个星期了。现在我发现 getInvoiceID()
方法是导致它的原因。当我评论这个方法时,项目 运行 很好,但是在任何时候调用这个函数都会阻止进一步调用 jdbc.
我尝试使用替代方法从发票中检索自动生成的字段table,但问题仍然存在。
public static int getInvoiceID() {
int invoiceID = -1;
try ( Statement stmt = DatabaseManager.getInstance().getConnection()
.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_READ_ONLY);
ResultSet res = stmt.executeQuery("SELECT COUNT(*) FROM INFORMATION_SCHEMA.SYSTEM_SESSIONS");) {
if(res.next())
invoiceID = res.getInt(1);
else
invoiceID = 1;
} catch (SQLException e) {
System.err.println("getInvoiceID Exception: " + e.getMessage());
}
return invoiceID;
}
以上方案参考自
public static int getInvoiceID() {
int invoiceID = -1;
try ( Statement stmt = DatabaseManager.getInstance().getConnection()
.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_READ_ONLY);) {
stmt.executeQuery("INSERT INTO Invoice VALUES (NULL, NULL, NOW(), NULL);");
try (ResultSet result = stmt.executeQuery("CALL IDENTITY();")) {
if(result.next())
invoiceID = result.getInt(1);
} catch( SQLException e){
e.printStackTrace();
}
} catch (SQLException e) {
System.err.println("getInvoiceID Exception: " + e.getMessage());
}
return invoiceID;
}
我也尝试了 generated keys
的解决方案昨天准备post这道题的时候发现异常是因为我用了ResultSet.TYPE_FORWARD_ONLY
然后改成ResultSet.TYPE_SCROLL_INSENSITIVE
终于解决了。但现在我非常确定这个异常是由方法 getInvoiceID()
引起的,并由下一个试图访问数据库的函数调用抛出。
这是我的 table
CREATE TABLE IF NOT EXISTS Invoice(
InvoiceID INT GENERATED BY DEFAULT AS IDENTITY(START WITH 1) PRIMARY KEY,
ClientID VARCHAR(4),
Entry DATETIME NOT NULL,
TotalAmount DECIMAL(10,2) DEFAULT 0,
FOREIGN KEY (ClientID) REFERENCES Client(ClientID)
);
异常:
java.sql.SQLNonTransientConnectionException: connection exception: connection does not exist
at org.hsqldb.jdbc.JDBCUtil.sqlException(Unknown Source)
at org.hsqldb.jdbc.JDBCUtil.sqlException(Unknown Source)
at org.hsqldb.jdbc.JDBCUtil.sqlException(Unknown Source)
at org.hsqldb.jdbc.JDBCUtil.connectionClosedException(Unknown Source)
at org.hsqldb.jdbc.JDBCConnection.checkClosed(Unknown Source)
at org.hsqldb.jdbc.JDBCConnection.prepareStatement(Unknown Source)
at database.ProductManager.getProductByID(ProductManager.java:203)
at gui.InvoicePanel.actionPerformed(InvoicePanel.java:423)
at javax.swing.AbstractButton.fireActionPerformed(Unknown Source)
at javax.swing.AbstractButton$Handler.actionPerformed(Unknown Source)
at javax.swing.DefaultButtonModel.fireActionPerformed(Unknown Source)
at javax.swing.DefaultButtonModel.setPressed(Unknown Source)
at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(Unknown Source)
at java.awt.Component.processMouseEvent(Unknown Source)
at javax.swing.JComponent.processMouseEvent(Unknown Source)
at java.awt.Component.processEvent(Unknown Source)
at java.awt.Container.processEvent(Unknown Source)
at java.awt.Component.dispatchEventImpl(Unknown Source)
at java.awt.Container.dispatchEventImpl(Unknown Source)
at java.awt.Component.dispatchEvent(Unknown Source)
at java.awt.LightweightDispatcher.retargetMouseEvent(Unknown Source)
at java.awt.LightweightDispatcher.processMouseEvent(Unknown Source)
at java.awt.LightweightDispatcher.dispatchEvent(Unknown Source)
at java.awt.Container.dispatchEventImpl(Unknown Source)
at java.awt.Window.dispatchEventImpl(Unknown Source)
at java.awt.Component.dispatchEvent(Unknown Source)
at java.awt.EventQueue.dispatchEventImpl(Unknown Source)
at java.awt.EventQueue.access0(Unknown Source)
at java.awt.EventQueue.run(Unknown Source)
at java.awt.EventQueue.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(Unknown Source)
at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(Unknown Source)
at java.awt.EventQueue.run(Unknown Source)
at java.awt.EventQueue.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(Unknown Source)
at java.awt.EventQueue.dispatchEvent(Unknown Source)
at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source)
at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
at java.awt.EventDispatchThread.run(Unknown Source)
Caused by: org.hsqldb.HsqlException: connection exception: connection does not exist
at org.hsqldb.error.Error.error(Unknown Source)
at org.hsqldb.error.Error.error(Unknown Source)
... 42 more
问题出在 Connection
我修改了我的代码并在执行任何 SQL 后关闭了 connection
。这解决了我的问题如下:
// getConnection() returns new connection if null
DatabaseManager.getInstance().getConnection();
/*
* SQL
*/
DatabaseManager.getInstance().close();