Skip to content

Commit 6314395

Browse files
committed
Fix connection leaks by properly closing service registries
1 parent 77c1370 commit 6314395

File tree

65 files changed

+1286
-1145
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

65 files changed

+1286
-1145
lines changed

hibernate-core/src/main/java/org/hibernate/cfg/Configuration.java

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -763,7 +763,14 @@ public SessionFactory buildSessionFactory(ServiceRegistry serviceRegistry) throw
763763
public SessionFactory buildSessionFactory() throws HibernateException {
764764
log.debug( "Building session factory using internal StandardServiceRegistryBuilder" );
765765
standardServiceRegistryBuilder.applySettings( properties );
766-
return buildSessionFactory( standardServiceRegistryBuilder.build() );
766+
StandardServiceRegistry serviceRegistry = standardServiceRegistryBuilder.build();
767+
try {
768+
return buildSessionFactory( serviceRegistry );
769+
}
770+
catch (Throwable t) {
771+
serviceRegistry.close();
772+
throw t;
773+
}
767774
}
768775

769776

hibernate-core/src/main/java/org/hibernate/jpa/boot/internal/EntityManagerFactoryBuilderImpl.java

Lines changed: 63 additions & 55 deletions
Original file line numberDiff line numberDiff line change
@@ -223,80 +223,88 @@ private EntityManagerFactoryBuilderImpl(
223223
providedClassLoader,
224224
providedClassLoaderService
225225
);
226+
try {
227+
// merge configuration sources and build the "standard" service registry
228+
final StandardServiceRegistryBuilder ssrBuilder = getStandardServiceRegistryBuilder( bsr );
226229

227-
// merge configuration sources and build the "standard" service registry
228-
final StandardServiceRegistryBuilder ssrBuilder = getStandardServiceRegistryBuilder( bsr );
229-
230-
final MergedSettings mergedSettings = mergeSettings( persistenceUnit, integrationSettings, ssrBuilder );
230+
final MergedSettings mergedSettings = mergeSettings( persistenceUnit, integrationSettings, ssrBuilder );
231231

232-
// flush before completion validation
233-
if ( "true".equals( mergedSettings.configurationValues.get( Environment.FLUSH_BEFORE_COMPLETION ) ) ) {
234-
LOG.definingFlushBeforeCompletionIgnoredInHem( Environment.FLUSH_BEFORE_COMPLETION );
235-
mergedSettings.configurationValues.put( Environment.FLUSH_BEFORE_COMPLETION, "false" );
236-
}
232+
// flush before completion validation
233+
if ( "true".equals( mergedSettings.configurationValues.get( Environment.FLUSH_BEFORE_COMPLETION ) ) ) {
234+
LOG.definingFlushBeforeCompletionIgnoredInHem( Environment.FLUSH_BEFORE_COMPLETION );
235+
mergedSettings.configurationValues.put( Environment.FLUSH_BEFORE_COMPLETION, "false" );
236+
}
237237

238-
// keep the merged config values for phase-2
239-
this.configurationValues = mergedSettings.getConfigurationValues();
238+
// keep the merged config values for phase-2
239+
this.configurationValues = mergedSettings.getConfigurationValues();
240240

241-
// Build the "standard" service registry
242-
ssrBuilder.applySettings( configurationValues );
241+
// Build the "standard" service registry
242+
ssrBuilder.applySettings( configurationValues );
243243

244-
this.standardServiceRegistry = ssrBuilder.build();
244+
this.standardServiceRegistry = ssrBuilder.build();
245245

246-
configureIdentifierGenerators( standardServiceRegistry );
246+
configureIdentifierGenerators( standardServiceRegistry );
247247

248-
final MetadataSources metadataSources = new MetadataSources( bsr );
249-
this.metamodelBuilder = (MetadataBuilderImplementor) metadataSources.getMetadataBuilder( standardServiceRegistry );
250-
List<ConverterDescriptor> attributeConverterDefinitions = applyMappingResources( metadataSources );
248+
final MetadataSources metadataSources = new MetadataSources( bsr );
249+
this.metamodelBuilder = (MetadataBuilderImplementor) metadataSources.getMetadataBuilder(
250+
standardServiceRegistry );
251+
List<ConverterDescriptor> attributeConverterDefinitions = applyMappingResources( metadataSources );
251252

252-
applyMetamodelBuilderSettings( mergedSettings, attributeConverterDefinitions );
253+
applyMetamodelBuilderSettings( mergedSettings, attributeConverterDefinitions );
253254

254-
applyMetadataBuilderContributor();
255+
applyMetadataBuilderContributor();
255256

256-
// todo : would be nice to have MetadataBuilder still do the handling of CfgXmlAccessService here
257-
// another option is to immediately handle them here (probably in mergeSettings?) as we encounter them...
258-
final CfgXmlAccessService cfgXmlAccessService = standardServiceRegistry.getService( CfgXmlAccessService.class );
259-
if ( cfgXmlAccessService.getAggregatedConfig() != null ) {
260-
if ( cfgXmlAccessService.getAggregatedConfig().getMappingReferences() != null ) {
261-
for ( MappingReference mappingReference : cfgXmlAccessService.getAggregatedConfig().getMappingReferences() ) {
262-
mappingReference.apply( metadataSources );
257+
// todo : would be nice to have MetadataBuilder still do the handling of CfgXmlAccessService here
258+
// another option is to immediately handle them here (probably in mergeSettings?) as we encounter them...
259+
final CfgXmlAccessService cfgXmlAccessService = standardServiceRegistry.getService( CfgXmlAccessService.class );
260+
if ( cfgXmlAccessService.getAggregatedConfig() != null ) {
261+
if ( cfgXmlAccessService.getAggregatedConfig().getMappingReferences() != null ) {
262+
for ( MappingReference mappingReference : cfgXmlAccessService.getAggregatedConfig()
263+
.getMappingReferences() ) {
264+
mappingReference.apply( metadataSources );
265+
}
263266
}
264267
}
265-
}
266268

267-
this.managedResources = MetadataBuildingProcess.prepare(
268-
metadataSources,
269-
metamodelBuilder.getBootstrapContext()
270-
);
269+
this.managedResources = MetadataBuildingProcess.prepare(
270+
metadataSources,
271+
metamodelBuilder.getBootstrapContext()
272+
);
271273

272-
final Object validatorFactory = configurationValues.get( org.hibernate.cfg.AvailableSettings.JPA_VALIDATION_FACTORY );
273-
if ( validatorFactory == null ) {
274-
withValidatorFactory( configurationValues.get( org.hibernate.cfg.AvailableSettings.JAKARTA_JPA_VALIDATION_FACTORY ) );
275-
}
276-
else {
277-
withValidatorFactory( validatorFactory );
278-
}
274+
final Object validatorFactory = configurationValues.get( org.hibernate.cfg.AvailableSettings.JPA_VALIDATION_FACTORY );
275+
if ( validatorFactory == null ) {
276+
withValidatorFactory( configurationValues.get( org.hibernate.cfg.AvailableSettings.JAKARTA_JPA_VALIDATION_FACTORY ) );
277+
}
278+
else {
279+
withValidatorFactory( validatorFactory );
280+
}
279281

280-
// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
281-
// push back class transformation to the environment; for the time being this only has any effect in EE
282-
// container situations, calling back into PersistenceUnitInfo#addClassTransformer
282+
// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
283+
// push back class transformation to the environment; for the time being this only has any effect in EE
284+
// container situations, calling back into PersistenceUnitInfo#addClassTransformer
283285

284-
final boolean dirtyTrackingEnabled = readBooleanConfigurationValue( AvailableSettings.ENHANCER_ENABLE_DIRTY_TRACKING );
285-
final boolean lazyInitializationEnabled = readBooleanConfigurationValue( AvailableSettings.ENHANCER_ENABLE_LAZY_INITIALIZATION );
286-
final boolean associationManagementEnabled = readBooleanConfigurationValue( AvailableSettings.ENHANCER_ENABLE_ASSOCIATION_MANAGEMENT );
286+
final boolean dirtyTrackingEnabled = readBooleanConfigurationValue( AvailableSettings.ENHANCER_ENABLE_DIRTY_TRACKING );
287+
final boolean lazyInitializationEnabled = readBooleanConfigurationValue( AvailableSettings.ENHANCER_ENABLE_LAZY_INITIALIZATION );
288+
final boolean associationManagementEnabled = readBooleanConfigurationValue( AvailableSettings.ENHANCER_ENABLE_ASSOCIATION_MANAGEMENT );
287289

288-
if ( dirtyTrackingEnabled || lazyInitializationEnabled || associationManagementEnabled ) {
289-
EnhancementContext enhancementContext = getEnhancementContext(
290-
dirtyTrackingEnabled,
291-
lazyInitializationEnabled,
292-
associationManagementEnabled
293-
);
290+
if ( dirtyTrackingEnabled || lazyInitializationEnabled || associationManagementEnabled ) {
291+
EnhancementContext enhancementContext = getEnhancementContext(
292+
dirtyTrackingEnabled,
293+
lazyInitializationEnabled,
294+
associationManagementEnabled
295+
);
294296

295-
persistenceUnit.pushClassTransformer( enhancementContext );
296-
}
297+
persistenceUnit.pushClassTransformer( enhancementContext );
298+
}
297299

298-
// for the time being we want to revoke access to the temp ClassLoader if one was passed
299-
metamodelBuilder.applyTempClassLoader( null );
300+
// for the time being we want to revoke access to the temp ClassLoader if one was passed
301+
metamodelBuilder.applyTempClassLoader( null );
302+
}
303+
catch (Throwable t) {
304+
bsr.close();
305+
cleanup();
306+
throw t;
307+
}
300308
}
301309

302310
/**

hibernate-core/src/test/java/org/hibernate/orm/test/annotations/ConfigurationTest.java

Lines changed: 68 additions & 68 deletions
Original file line numberDiff line numberDiff line change
@@ -37,17 +37,17 @@ public void testDeclarativeMix() {
3737
Configuration cfg = new Configuration();
3838
cfg.configure( "org/hibernate/orm/test/annotations/hibernate.cfg.xml" );
3939
cfg.setProperty( Environment.HBM2DDL_AUTO, "create-drop" );
40-
SessionFactory sf = cfg.buildSessionFactory();
41-
assertNotNull( sf );
42-
Session s = sf.openSession();
43-
Transaction tx = s.beginTransaction();
44-
Query q = s.createQuery( "from Boat" );
45-
assertEquals( 0, q.list().size() );
46-
q = s.createQuery( "from Plane" );
47-
assertEquals( 0, q.list().size() );
48-
tx.commit();
49-
s.close();
50-
sf.close();
40+
try (SessionFactory sf = cfg.buildSessionFactory()) {
41+
assertNotNull( sf );
42+
Session s = sf.openSession();
43+
Transaction tx = s.beginTransaction();
44+
Query q = s.createQuery( "from Boat" );
45+
assertEquals( 0, q.list().size() );
46+
q = s.createQuery( "from Plane" );
47+
assertEquals( 0, q.list().size() );
48+
tx.commit();
49+
s.close();
50+
}
5151
}
5252

5353
@Test
@@ -93,24 +93,24 @@ public void testPrecedenceHbm() {
9393
cfg.configure( "org/hibernate/orm/test/annotations/hibernate.cfg.xml" );
9494
cfg.setProperty( Environment.HBM2DDL_AUTO, "create-drop" );
9595
cfg.addAnnotatedClass( Boat.class );
96-
SessionFactory sf = cfg.buildSessionFactory();
97-
assertNotNull( sf );
98-
Session s = sf.openSession();
99-
s.getTransaction().begin();
100-
Boat boat = new Boat();
101-
boat.setSize( 12 );
102-
boat.setWeight( 34 );
103-
s.persist( boat );
104-
s.getTransaction().commit();
105-
s.clear();
106-
Transaction tx = s.beginTransaction();
107-
boat = (Boat) s.get( Boat.class, boat.getId() );
108-
assertTrue( 34 != boat.getWeight(), "Annotation has precedence" );
109-
s.delete( boat );
110-
//s.getTransaction().commit();
111-
tx.commit();
112-
s.close();
113-
sf.close();
96+
try (SessionFactory sf = cfg.buildSessionFactory()) {
97+
assertNotNull( sf );
98+
Session s = sf.openSession();
99+
s.getTransaction().begin();
100+
Boat boat = new Boat();
101+
boat.setSize( 12 );
102+
boat.setWeight( 34 );
103+
s.persist( boat );
104+
s.getTransaction().commit();
105+
s.clear();
106+
Transaction tx = s.beginTransaction();
107+
boat = (Boat) s.get( Boat.class, boat.getId() );
108+
assertTrue( 34 != boat.getWeight(), "Annotation has precedence" );
109+
s.delete( boat );
110+
//s.getTransaction().commit();
111+
tx.commit();
112+
s.close();
113+
}
114114
}
115115

116116
@Test
@@ -120,23 +120,23 @@ public void testPrecedenceAnnotation() {
120120
cfg.setProperty( Environment.HBM2DDL_AUTO, "create-drop" );
121121
cfg.setProperty( Configuration.ARTEFACT_PROCESSING_ORDER, "class, hbm" );
122122
cfg.addAnnotatedClass( Boat.class );
123-
SessionFactory sf = cfg.buildSessionFactory();
124-
assertNotNull( sf );
125-
Session s = sf.openSession();
126-
s.getTransaction().begin();
127-
Boat boat = new Boat();
128-
boat.setSize( 12 );
129-
boat.setWeight( 34 );
130-
s.persist( boat );
131-
s.getTransaction().commit();
132-
s.clear();
133-
Transaction tx = s.beginTransaction();
134-
boat = (Boat) s.get( Boat.class, boat.getId() );
135-
assertTrue( 34 == boat.getWeight(), "Annotation has precedence" );
136-
s.delete( boat );
137-
tx.commit();
138-
s.close();
139-
sf.close();
123+
try (SessionFactory sf = cfg.buildSessionFactory()) {
124+
assertNotNull( sf );
125+
Session s = sf.openSession();
126+
s.getTransaction().begin();
127+
Boat boat = new Boat();
128+
boat.setSize( 12 );
129+
boat.setWeight( 34 );
130+
s.persist( boat );
131+
s.getTransaction().commit();
132+
s.clear();
133+
Transaction tx = s.beginTransaction();
134+
boat = (Boat) s.get( Boat.class, boat.getId() );
135+
assertTrue( 34 == boat.getWeight(), "Annotation has precedence" );
136+
s.delete( boat );
137+
tx.commit();
138+
s.close();
139+
}
140140
}
141141

142142
@Test
@@ -145,17 +145,17 @@ public void testHbmWithSubclassExtends() {
145145
cfg.configure( "org/hibernate/orm/test/annotations/hibernate.cfg.xml" );
146146
cfg.addClass( Ferry.class );
147147
cfg.setProperty( Environment.HBM2DDL_AUTO, "create-drop" );
148-
SessionFactory sf = cfg.buildSessionFactory();
149-
assertNotNull( sf );
150-
Session s = sf.openSession();
151-
Transaction tx = s.beginTransaction();
152-
Query q = s.createQuery( "from Ferry" );
153-
assertEquals( 0, q.list().size() );
154-
q = s.createQuery( "from Plane" );
155-
assertEquals( 0, q.list().size() );
156-
tx.commit();
157-
s.close();
158-
sf.close();
148+
try (SessionFactory sf = cfg.buildSessionFactory()) {
149+
assertNotNull( sf );
150+
Session s = sf.openSession();
151+
Transaction tx = s.beginTransaction();
152+
Query q = s.createQuery( "from Ferry" );
153+
assertEquals( 0, q.list().size() );
154+
q = s.createQuery( "from Plane" );
155+
assertEquals( 0, q.list().size() );
156+
tx.commit();
157+
s.close();
158+
}
159159
}
160160

161161
@Test
@@ -164,16 +164,16 @@ public void testAnnReferencesHbm() {
164164
cfg.configure( "org/hibernate/orm/test/annotations/hibernate.cfg.xml" );
165165
cfg.addAnnotatedClass( Port.class );
166166
cfg.setProperty( Environment.HBM2DDL_AUTO, "create-drop" );
167-
SessionFactory sf = cfg.buildSessionFactory();
168-
assertNotNull( sf );
169-
Session s = sf.openSession();
170-
Transaction tx = s.beginTransaction();
171-
Query q = s.createQuery( "from Boat" );
172-
assertEquals( 0, q.list().size() );
173-
q = s.createQuery( "from Port" );
174-
assertEquals( 0, q.list().size() );
175-
tx.commit();
176-
s.close();
177-
sf.close();
167+
try (SessionFactory sf = cfg.buildSessionFactory()) {
168+
assertNotNull( sf );
169+
Session s = sf.openSession();
170+
Transaction tx = s.beginTransaction();
171+
Query q = s.createQuery( "from Boat" );
172+
assertEquals( 0, q.list().size() );
173+
q = s.createQuery( "from Port" );
174+
assertEquals( 0, q.list().size() );
175+
tx.commit();
176+
s.close();
177+
}
178178
}
179179
}

hibernate-core/src/test/java/org/hibernate/orm/test/annotations/SafeMappingTest.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,7 @@ public void testDeclarativeMix() throws Exception {
4646
if ( serviceRegistry != null ) {
4747
ServiceRegistryBuilder.destroy( serviceRegistry );
4848
}
49+
cfg.getStandardServiceRegistryBuilder().getBootstrapServiceRegistry().close();
4950
}
5051
}
5152
}

hibernate-core/src/test/java/org/hibernate/orm/test/annotations/SecuredBindingTest.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,7 @@ public void testConfigurationMethods() throws Exception {
6161
if ( serviceRegistry != null ) {
6262
ServiceRegistryBuilder.destroy( serviceRegistry );
6363
}
64+
ac.getStandardServiceRegistryBuilder().getBootstrapServiceRegistry().close();
6465
}
6566
}
6667
}

hibernate-core/src/test/java/org/hibernate/orm/test/annotations/backquotes/BackquoteTest.java

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,8 @@
1515

1616
import org.hibernate.MappingException;
1717
import org.hibernate.SessionFactory;
18+
import org.hibernate.boot.registry.BootstrapServiceRegistry;
19+
import org.hibernate.boot.registry.BootstrapServiceRegistryBuilder;
1820
import org.hibernate.cfg.Configuration;
1921
import org.hibernate.cfg.Environment;
2022
import org.hibernate.service.ServiceRegistry;
@@ -88,11 +90,11 @@ public void testBackquotes() {
8890
@Test
8991
@TestForIssue(jiraKey = "HHH-4647")
9092
public void testInvalidReferenceToQuotedTableName() {
91-
try {
92-
Configuration config = new Configuration();
93+
try (BootstrapServiceRegistry serviceRegistry = new BootstrapServiceRegistryBuilder().build()) {
94+
Configuration config = new Configuration( serviceRegistry );
9395
config.addAnnotatedClass( Printer.class );
9496
config.addAnnotatedClass( PrinterCable.class );
95-
sessionFactory = config.buildSessionFactory( serviceRegistry );
97+
sessionFactory = config.buildSessionFactory( this.serviceRegistry );
9698
fail( "expected MappingException to be thrown" );
9799
}
98100
//we WANT MappingException to be thrown

hibernate-core/src/test/java/org/hibernate/orm/test/annotations/configuration/ConfigurationTest.java

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,8 @@
88
//$Id$
99
package org.hibernate.orm.test.annotations.configuration;
1010

11+
import org.hibernate.boot.registry.BootstrapServiceRegistry;
12+
import org.hibernate.boot.registry.BootstrapServiceRegistryBuilder;
1113
import org.hibernate.cfg.Configuration;
1214

1315
import org.junit.Assert;
@@ -19,8 +21,8 @@
1921
public class ConfigurationTest {
2022
@Test
2123
public void testMixPackageAndResourceOrdering() throws Exception {
22-
try {
23-
Configuration config = new Configuration();
24+
try (BootstrapServiceRegistry serviceRegistry = new BootstrapServiceRegistryBuilder().build()) {
25+
Configuration config = new Configuration( serviceRegistry );
2426
config.addResource( "org/hibernate/orm/test/annotations/configuration/orm.xml" );
2527
config.addPackage( "org.hibernate.orm/test.annotations.configuration" );
2628
}

0 commit comments

Comments
 (0)