HSQL连接异常,连接不存在

Posted

技术标签:

【中文标题】HSQL连接异常,连接不存在【英文标题】:HSQL connection exception, connection does not exist 【发布时间】:2018-02-01 16:31:19 【问题描述】:

我遇到了非常模棱两可的异常connection exception : connection does not exist,我花了很多时间才找到它的来源。我一直在搜索 HSQLDB 文档及其邮件列表、*** 等。最近我找到了异常的实际原因。

在我的 jdbc 项目中,我想从 HSQLDB 获取自动生成的invoiceID,但是当我尝试这样做时,结果是没问题的,但是之后当我运行另一个读取或更新数据库中某些内容的查询时,我得到了这个例外。我已经观察这个问题三周了。现在我发现getInvoiceID() 方法导致了它。当我评论此方法时,项目运行良好,但在任何时候调用此函数都会阻止对 jdbc 的进一步调用。

我尝试使用其他方法从发票表中检索自动生成的字段,但问题仍然存在。

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;

以上方案引用自Here

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的解决方案

昨天当我要发布这个问题时,我发现抛出异常是因为我使用了ResultSet.TYPE_FORWARD_ONLY,然后我改为ResultSet.TYPE_SCROLL_INSENSITIVE,最终解决了这个问题。但现在我很确定这个异常是由getInvoiceID() 方法引起的,并且是由下一个试图访问数据库的函数调用引发的。

这是我的桌子

 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$4.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.access$500(Unknown Source)
at java.awt.EventQueue$3.run(Unknown Source)
at java.awt.EventQueue$3.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$4.run(Unknown Source)
at java.awt.EventQueue$4.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

【问题讨论】:

请发布完整的异常堆栈跟踪。 问题是您在不理解它们的含义的情况下不必要地使用了方法和参数。最好的方法是使用 getGeneratedKeys()。其他方法可能会令人困惑。不要使用 TYPE_SCROLL_INSENSITIVE 或 CONCUR_READ_ONLY 等。只需使用默认的 createStatement() @fredt 正如我所解释的,我已经尝试使用该方法,所有三种解决方案都提供相同的结果。我在我的问题中提到TYPE_FORWARD_ONLY 也会导致此异常,因为您要求我删除默认为TYPE_FORWARD_ONLY 的参数。我也试过了,还是抛出了同样的异常。 “连接异常:连接不存在”表示您正在尝试使用与数据库的连接已关闭的Connection 对象。检查您的代码以查看可能发生的位置。我也同意 @fredt 的观点,您似乎真的不明白您要求 HSQLDB 做什么,例如,从 SELECT COUNT(*) FROM INFORMATION_SCHEMA.SYSTEM_SESSIONS 生成 invoiceID 非常有意义。 try(...) 块正在关闭连接,连接可能是单例。重写代码没有 try with resources 块并且不要关闭连接。 【参考方案1】:

问题在于Connection 我修改了我的代码并在执行任何 SQL 后关闭了connection。这解决了我的问题如下:

// getConnection() returns new connection if null
DatabaseManager.getInstance().getConnection();
/*
 * SQL
 */
DatabaseManager.getInstance().close();

【讨论】:

以上是关于HSQL连接异常,连接不存在的主要内容,如果未能解决你的问题,请参考以下文章

从 DatabaseSwingManager 连接时 HSQL 服务器模式引发异常 java.sql.SQLTransientConnectionException

无法获得 JDBC 连接;嵌套异常是 java.sql.SQLException:无法加载 JDBC 驱动程序类 'org.hsql.jdbcDriver'

JPA 正在连接到一个不存在的 HSQL 数据库?

clickhouse 复杂查询时嵌套连接join可能存在的异常解决(xjl456852原创)

15 flvjs 播放 ws 服务代理的不存在的 rtsp 连接, Cannot read properties of null (reading ‘flushStashedSamples‘)

15 flvjs 播放 ws 服务代理的不存在的 rtsp 连接, Cannot read properties of null (reading ‘flushStashedSamples‘)