diff --git a/hibernate-core/src/main/java/org/hibernate/dialect/Database.java b/hibernate-core/src/main/java/org/hibernate/dialect/Database.java index 0e323ae5647e..18720bd65145 100644 --- a/hibernate-core/src/main/java/org/hibernate/dialect/Database.java +++ b/hibernate-core/src/main/java/org/hibernate/dialect/Database.java @@ -44,11 +44,15 @@ public Dialect createDialect(DialectResolutionInfo info) { return new DB2zDialect( info ); } case "QSQ": { - // i + // i, this only works if "use drda metadata version" property is set to true in the drivers properties return new DB2iDialect( info ); } } } + if ("DB2 UDB for AS/400".equals(info.getDatabaseName())) { + // i + return new DB2iDialect( info ); + } return new DB2Dialect( info ); } diff --git a/hibernate-core/src/main/java/org/hibernate/engine/jdbc/connections/internal/DriverManagerConnectionProviderImpl.java b/hibernate-core/src/main/java/org/hibernate/engine/jdbc/connections/internal/DriverManagerConnectionProviderImpl.java index 6bc006024660..e6cdc2a49ea9 100644 --- a/hibernate-core/src/main/java/org/hibernate/engine/jdbc/connections/internal/DriverManagerConnectionProviderImpl.java +++ b/hibernate-core/src/main/java/org/hibernate/engine/jdbc/connections/internal/DriverManagerConnectionProviderImpl.java @@ -472,7 +472,9 @@ protected void closeConnection(Connection conn, Throwable t) { } } finally { - allConnections.remove( conn ); + if ( !allConnections.remove( conn ) ) { + ConnectionInfoLogger.INSTANCE.debug( "Connection remove failed." ); + } } } diff --git a/hibernate-core/src/main/java/org/hibernate/engine/jdbc/env/internal/JdbcEnvironmentInitiator.java b/hibernate-core/src/main/java/org/hibernate/engine/jdbc/env/internal/JdbcEnvironmentInitiator.java index bcd86a040922..8588501c8786 100644 --- a/hibernate-core/src/main/java/org/hibernate/engine/jdbc/env/internal/JdbcEnvironmentInitiator.java +++ b/hibernate-core/src/main/java/org/hibernate/engine/jdbc/env/internal/JdbcEnvironmentInitiator.java @@ -326,13 +326,11 @@ protected JdbcEnvironmentImpl getJdbcEnvironmentUsingJdbcMetadata( new SqlExceptionHelper( false ), registry ); - temporaryJdbcSessionOwner.transactionCoordinator = registry.requireService( TransactionCoordinatorBuilder.class ) - .buildTransactionCoordinator( - new JdbcCoordinatorImpl( null, temporaryJdbcSessionOwner, jdbcServices ), - () -> false - ); + final JdbcCoordinatorImpl jdbcCoordinator = new JdbcCoordinatorImpl( null, temporaryJdbcSessionOwner, jdbcServices ); try { + temporaryJdbcSessionOwner.transactionCoordinator = registry.requireService( TransactionCoordinatorBuilder.class ) + .buildTransactionCoordinator( jdbcCoordinator, () -> false ); return temporaryJdbcSessionOwner.transactionCoordinator.createIsolationDelegate().delegateWork( new AbstractReturningWork<>() { @Override @@ -404,6 +402,10 @@ private int databaseMicroVersion(DatabaseMetaData metadata) throws SQLException catch ( Exception e ) { log.unableToObtainConnectionToQueryMetadata( e ); } + finally { + //noinspection resource + jdbcCoordinator.close(); + } // accessing the JDBC metadata failed return getJdbcEnvironmentWithDefaults( configurationValues, registry, dialectFactory ); } diff --git a/hibernate-core/src/test/java/org/hibernate/orm/test/dialect/resolver/DialectFactoryTest.java b/hibernate-core/src/test/java/org/hibernate/orm/test/dialect/resolver/DialectFactoryTest.java index 65b1c8d24de7..2f648db51892 100644 --- a/hibernate-core/src/test/java/org/hibernate/orm/test/dialect/resolver/DialectFactoryTest.java +++ b/hibernate-core/src/test/java/org/hibernate/orm/test/dialect/resolver/DialectFactoryTest.java @@ -156,8 +156,8 @@ public void testPreregisteredDialects() { testDetermination( "DB2/SUN", DB2Dialect.class, resolver ); testDetermination( "DB2/LINUX390", DB2Dialect.class, resolver ); testDetermination( "DB2/AIX64", DB2Dialect.class, resolver ); - testDetermination( "DB2 UDB for AS/400", DB2Dialect.class, resolver ); - testDetermination( "DB2 UDB for AS/400", 7, 3, DB2Dialect.class, resolver ); + testDetermination( "DB2 UDB for AS/400", DB2iDialect.class, resolver ); + testDetermination( "DB2 UDB for AS/400", 7, 3, DB2iDialect.class, resolver ); testDetermination( "Oracle", 8, OracleDialect.class, resolver ); testDetermination( "Oracle", 9, OracleDialect.class, resolver ); testDetermination( "Oracle", 10, OracleDialect.class, resolver ); diff --git a/hibernate-testing/src/main/java/org/hibernate/testing/jta/JtaAwareConnectionProviderImpl.java b/hibernate-testing/src/main/java/org/hibernate/testing/jta/JtaAwareConnectionProviderImpl.java index f90e6ad9ae9d..1964e46281d5 100644 --- a/hibernate-testing/src/main/java/org/hibernate/testing/jta/JtaAwareConnectionProviderImpl.java +++ b/hibernate-testing/src/main/java/org/hibernate/testing/jta/JtaAwareConnectionProviderImpl.java @@ -214,7 +214,7 @@ private void delist(Connection connection) { System.err.println( "!!!Error trying to reset synchronization registry!!!" ); } try { - delegate.closeConnection( connection ); + delegate.closeConnection( ((ConnectionWrapper) connection).delegate ); } catch (SQLException e) { System.err.println( "!!!Error trying to close JDBC connection from delist callbacks!!!" );