ennuite opened a new issue, #932: URL: https://github.com/apache/arrow-java/issues/932
### Describe the bug, including details regarding any error messages, version, and platform. According to the JDBC specification 4.3 available at https://download.oracle.com/otn-pub/jcp/jdbc-4_3-mrel3-eval-spec/jdbc4.3-fr-spec.pdf, chapter 9.6.4.1: > All Statement objects created from a given Connection object will be closed when the close method for the Connection object is called. In the Flight SQL JDBC driver closing a Connection does not automatically close the Statement instances obtained via that Connection, making it non compliant with the standard. Due to this non compliance, on closing a Connection that has a Statement with one or more ResultSet that haven't been fully consumed, we get an exception on `Connection.close()` Code to reproduce: ` try { // Establish connection Connection connection = DriverManager.getConnection(jdbcUrl, properties); System.out.println("Connected to Arrow Flight SQL server"); Statement stmt = connection.createStatement(); // my_table needs to have some rows for the bug to manifest itself ResultSet rs = stmt.executeQuery("SELECT * FROM my_table"); // adding this close will eliminate the memory leak, without needing to close the Statement // rs.close(); // with stmt.close() we get no memory leak, even if we didn't close the ResultSet //stmt.close(); connection.close(); System.out.println("\nConnection closed"); } catch (Exception e) { System.err.println("Error: " + e.getMessage()); e.printStackTrace(); } ` Resulting in the following exception and stack trace ` Dec 14, 2025 5:36:23 PM org.apache.arrow.driver.jdbc.shaded.org.apache.arrow.memory.BaseAllocator close SEVERE: Memory was leaked by query. Memory leaked: (32) Allocator(flight-client) 0/32/32/9223372036854775807 (res/actual/peak/limit) Error: Failed to clean up client resources. java.sql.SQLException: Failed to clean up client resources. at org.apache.arrow.driver.jdbc.client.ArrowFlightSqlClientHandler.close(ArrowFlightSqlClientHandler.java:269) at org.apache.arrow.driver.jdbc.ArrowFlightConnection.close(ArrowFlightConnection.java:178) at MemoryLeak.main(MemoryLeak.java:136) Caused by: java.lang.IllegalStateException: Memory was leaked by query. Memory leaked: (32) Allocator(flight-client) 0/32/32/9223372036854775807 (res/actual/peak/limit) at org.apache.arrow.driver.jdbc.shaded.org.apache.arrow.memory.BaseAllocator.close(BaseAllocator.java:504) at org.apache.arrow.driver.jdbc.shaded.org.apache.arrow.flight.FlightClient.close(FlightClient.java:744) at org.apache.arrow.driver.jdbc.shaded.org.apache.arrow.util.AutoCloseables.close(AutoCloseables.java:97) at org.apache.arrow.driver.jdbc.shaded.org.apache.arrow.util.AutoCloseables.close(AutoCloseables.java:75) at org.apache.arrow.driver.jdbc.shaded.org.apache.arrow.flight.sql.FlightSqlClient.close(FlightSqlClient.java:1137) at org.apache.arrow.driver.jdbc.shaded.org.apache.arrow.util.AutoCloseables.close(AutoCloseables.java:97) at org.apache.arrow.driver.jdbc.shaded.org.apache.arrow.util.AutoCloseables.close(AutoCloseables.java:75) at org.apache.arrow.driver.jdbc.client.ArrowFlightSqlClientHandler.close(ArrowFlightSqlClientHandler.java:267) ... 2 more ` While a user of the driver with good defensive programming practice would open the ResultSet and/or Statement in a try-with block, the driver should still follow the standard and not produce this Exception -- This is an automated message from the Apache Git Service. To respond to the message, please log on to GitHub and use the URL above to go to the specific comment. To unsubscribe, e-mail: [email protected] For queries about this service, please contact Infrastructure at: [email protected]
