{"record":{"id":"93bd28209cc461de","repo":"pentaho/pentaho-kettle","slug":"error-closing-resultset-after-getting-catalogs","errorCode":null,"errorMessage":"Error closing resultset after getting catalogs!","messagePattern":"Error closing resultset after getting catalogs!","errorType":"exception","errorClass":"KettleDatabaseException","httpStatus":null,"severity":"error","filePath":"core/src/main/java/org/pentaho/di/core/database/Database.java","lineNumber":4552,"sourceCode":"\n  public String[] getCatalogs() throws KettleDatabaseException {\n    ArrayList<String> catalogList = new ArrayList<>();\n    ResultSet catalogResultSet = null;\n    try {\n      catalogResultSet = getDatabaseMetaData().getCatalogs();\n      // Grab all the catalog names and put them in an array list\n      while ( catalogResultSet != null && catalogResultSet.next() ) {\n        catalogList.add( catalogResultSet.getString( 1 ) );\n      }\n    } catch ( SQLException e ) {\n      throw new KettleDatabaseException( \"Error getting catalogs!\", e );\n    } finally {\n      try {\n        if ( catalogResultSet != null ) {\n          catalogResultSet.close();\n        }\n      } catch ( SQLException e ) {\n        throw new KettleDatabaseException( \"Error closing resultset after getting catalogs!\", e );\n      }\n    }\n\n    if ( log.isDetailed() ) {\n      log.logDetailed( \"read :\" + catalogList.size() + \" catalogs from db meta-data.\" );\n    }\n\n    return catalogList.toArray( new String[ catalogList.size() ] );\n  }\n\n  public String[] getProcedures() throws KettleDatabaseException {\n    String sql = databaseMeta.getSQLListOfProcedures();\n    if ( sql != null ) {\n      List<Object[]> procs = getRows( sql, 1000 );\n      String[] str = new String[ procs.size() ];\n      for ( int i = 0; i < procs.size(); i++ ) {\n        str[ i ] = procs.get( i )[ 0 ].toString();\n      }","sourceCodeStart":4534,"sourceCodeEnd":4570,"githubUrl":"https://github.com/pentaho/pentaho-kettle/blob/f3058517a153da500bf4551f46d79b91bf8ec552/core/src/main/java/org/pentaho/di/core/database/Database.java#L4534-L4570","documentation":"Thrown in the finally block of getCatalogs() when the catalog ResultSet cannot be closed after reading catalogs. The listing may have succeeded but cursor cleanup failed, typically due to a broken connection or driver cursor-close failure. Wrapped as KettleDatabaseException.","triggerScenarios":"Database.getCatalogs() where catalogResultSet is non-null but close() throws SQLException — session dropped during/after the metadata query, invalidated cursor, or concurrent connection use.","commonSituations":"Idle-timeout killing the session between metadata calls; firewall dropping the TCP connection; driver bug closing cursors after prior metadata errors; thread-sharing of a single Database object.","solutions":["Reconnect before metadata calls on long-lived Database objects (checkConnection, then disconnect/connect).","Keep one Database instance per thread.","Raise idle/network timeouts to survive long jobs.","Inspect the chained SQLException cause for the driver-level reason."],"exampleFix":"// before\ndb.getCatalogs(); // stale connection after long idle\n\n// after\nif (!db.checkConnection()) { db.disconnect(); db.connect(); }\ndb.getCatalogs();","handlingStrategy":"try-catch","validationCode":"if (!db.checkConnection()) { db.disconnect(); db.connect(); }","typeGuard":null,"tryCatchPattern":"try {\n  catalogs = db.getCatalogs();\n} catch (KettleDatabaseException e) {\n  log.warn(\"Catalog resultset close failed: \" + e.getCause());\n  db.disconnect(); db.connect();\n}","preventionTips":["Reconnect before metadata reads on long-lived connections","Avoid thread-sharing of Database objects","Raise idle timeouts to survive long jobs","Examine the chained SQLException for driver issues"],"tags":["jdbc","database-metadata","resultset","connection"],"backgroundTag":"database-query-failed","analyzedSha":"f3058517a153da500bf4551f46d79b91bf8ec552","analyzedAt":"2026-09-13T14:04:16.340Z","contentChangedAt":"2026-09-13T14:04:16.340Z","schemaVersion":2},"datasetVersion":"2026-09-20T23:17:15.980Z"}