This is an automated email from the git hooks/post-receive script. New commit to branch develop in repository topia. See https://gitlab.nuiton.org/nuiton/topia.git commit b5c7069dce466121db79febf3a8dd9e0439f0c1e Author: Tony CHEMIT <dev@tchemit.fr> Date: Wed Jan 18 19:47:12 2017 +0100 Big connections leak :( (Fixes #4137) --- .../internal/AbstractTopiaApplicationContext.java | 23 +++-- .../persistence/internal/HibernateProvider.java | 32 +++---- .../topia/migration/TopiaMigrationEngine.java | 97 ++-------------------- 3 files changed, 42 insertions(+), 110 deletions(-) diff --git a/topia-persistence/src/main/java/org/nuiton/topia/persistence/internal/AbstractTopiaApplicationContext.java b/topia-persistence/src/main/java/org/nuiton/topia/persistence/internal/AbstractTopiaApplicationContext.java index 66c2960..d3c7133 100644 --- a/topia-persistence/src/main/java/org/nuiton/topia/persistence/internal/AbstractTopiaApplicationContext.java +++ b/topia-persistence/src/main/java/org/nuiton/topia/persistence/internal/AbstractTopiaApplicationContext.java @@ -31,6 +31,7 @@ import org.apache.commons.lang3.StringUtils; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.hibernate.HibernateException; +import org.hibernate.SessionFactory; import org.hibernate.boot.Metadata; import org.hibernate.cfg.AvailableSettings; import org.hibernate.cfg.Configuration; @@ -364,9 +365,14 @@ public abstract class AbstractTopiaApplicationContext<K extends TopiaPersistence // AThimel 14/06/14 getHibernateConfiguration() may create the schema, prefer using newHibernateConfiguration() which doesn't Configuration configuration = getHibernateProvider().newHibernateConfiguration(); configuration.getProperties().put(AvailableSettings.HBM2DDL_AUTO, "none"); - Metadata metaData = getHibernateProvider().newMetaData(configuration); - boolean result = TopiaUtil.isSchemaEmpty(configuration, metaData); - return result; + SessionFactory sessionFactory = hibernateProvider.newSessionFactory(configuration); + try { + Metadata metaData = getHibernateProvider().newMetaData(configuration, sessionFactory); + boolean result = TopiaUtil.isSchemaEmpty(configuration, metaData); + return result; + } finally { + sessionFactory.close(); + } } @Override @@ -394,9 +400,14 @@ public abstract class AbstractTopiaApplicationContext<K extends TopiaPersistence topiaFiresSupport.firePreCreateSchema(this); Configuration configuration = getHibernateProvider().newHibernateConfiguration(); configuration.getProperties().remove(AvailableSettings.HBM2DDL_AUTO); - Metadata metadata = getHibernateProvider().newMetaData(configuration); - new SchemaExport().execute(targetTypes, SchemaExport.Action.CREATE, metadata); - topiaFiresSupport.firePostCreateSchema(this); + SessionFactory sessionFactory = getHibernateProvider().newSessionFactory(configuration); + try { + Metadata metadata = getHibernateProvider().newMetaData(configuration, sessionFactory); + new SchemaExport().execute(targetTypes, SchemaExport.Action.CREATE, metadata); + topiaFiresSupport.firePostCreateSchema(this); + } finally { + sessionFactory.close(); + } } catch (HibernateException eee) { throw new TopiaException(String.format("Could not create schema for reason: %s", eee.getMessage()), eee); } diff --git a/topia-persistence/src/main/java/org/nuiton/topia/persistence/internal/HibernateProvider.java b/topia-persistence/src/main/java/org/nuiton/topia/persistence/internal/HibernateProvider.java index bc1667f..c0d5ed9 100644 --- a/topia-persistence/src/main/java/org/nuiton/topia/persistence/internal/HibernateProvider.java +++ b/topia-persistence/src/main/java/org/nuiton/topia/persistence/internal/HibernateProvider.java @@ -213,45 +213,45 @@ public class HibernateProvider { // DB2 if (jdbcConfigurationBuilder.isDb2Url(jdbcConnectionUrl) - || jdbcConfigurationBuilder.isH2Url(jdbcConnectionUrl) && jdbcConnectionUrl.contains("MODE=DB2")) { + || jdbcConfigurationBuilder.isH2Url(jdbcConnectionUrl) && jdbcConnectionUrl.contains("MODE=DB2")) { guessedHibernateDialect = DB2Dialect.class.getName(); // Derby } else if (jdbcConfigurationBuilder.isDerbyUrl(jdbcConnectionUrl) - || jdbcConfigurationBuilder.isH2Url(jdbcConnectionUrl) && jdbcConnectionUrl.contains("MODE=Derby")) { + || jdbcConfigurationBuilder.isH2Url(jdbcConnectionUrl) && jdbcConnectionUrl.contains("MODE=Derby")) { guessedHibernateDialect = DerbyDialect.class.getName(); // HSQLDB } else if (jdbcConfigurationBuilder.isHsqlDbUrl(jdbcConnectionUrl) - || jdbcConfigurationBuilder.isH2Url(jdbcConnectionUrl) && jdbcConnectionUrl.contains("MODE=HSQLDB")) { + || jdbcConfigurationBuilder.isH2Url(jdbcConnectionUrl) && jdbcConnectionUrl.contains("MODE=HSQLDB")) { guessedHibernateDialect = HSQLDialect.class.getName(); // MySQL } else if (jdbcConfigurationBuilder.isMysqlUrl(jdbcConnectionUrl) - || jdbcConfigurationBuilder.isMariaDbUrl(jdbcConnectionUrl) - || jdbcConfigurationBuilder.isGoogleAppEngineUrl(jdbcConnectionUrl) - || jdbcConfigurationBuilder.isH2Url(jdbcConnectionUrl) && jdbcConnectionUrl.contains("MODE=MySQL")) { + || jdbcConfigurationBuilder.isMariaDbUrl(jdbcConnectionUrl) + || jdbcConfigurationBuilder.isGoogleAppEngineUrl(jdbcConnectionUrl) + || jdbcConfigurationBuilder.isH2Url(jdbcConnectionUrl) && jdbcConnectionUrl.contains("MODE=MySQL")) { guessedHibernateDialect = MySQL5Dialect.class.getName(); // Oracle } else if (jdbcConfigurationBuilder.isOracleUrl(jdbcConnectionUrl) - || jdbcConfigurationBuilder.isH2Url(jdbcConnectionUrl) && jdbcConnectionUrl.contains("MODE=Oracle")) { + || jdbcConfigurationBuilder.isH2Url(jdbcConnectionUrl) && jdbcConnectionUrl.contains("MODE=Oracle")) { guessedHibernateDialect = Oracle10gDialect.class.getName(); // PostgreSQL } else if (jdbcConfigurationBuilder.isPostgreSqlUrl(jdbcConnectionUrl) - || jdbcConfigurationBuilder.isH2Url(jdbcConnectionUrl) && jdbcConnectionUrl.contains("MODE=PostgreSQL")) { + || jdbcConfigurationBuilder.isH2Url(jdbcConnectionUrl) && jdbcConnectionUrl.contains("MODE=PostgreSQL")) { guessedHibernateDialect = PostgreSQL9Dialect.class.getName(); // MS SQLServer } else if (jdbcConfigurationBuilder.isJtdsUrl(jdbcConnectionUrl) - || jdbcConfigurationBuilder.isSqlServerUrl(jdbcConnectionUrl) - || jdbcConfigurationBuilder.isH2Url(jdbcConnectionUrl) && jdbcConnectionUrl.contains("MODE=MSSQLServer")) { + || jdbcConfigurationBuilder.isSqlServerUrl(jdbcConnectionUrl) + || jdbcConfigurationBuilder.isH2Url(jdbcConnectionUrl) && jdbcConnectionUrl.contains("MODE=MSSQLServer")) { guessedHibernateDialect = SQLServer2012Dialect.class.getName(); // SQLite } else if (jdbcConfigurationBuilder.isSqliteUrl(jdbcConnectionUrl) - || jdbcConfigurationBuilder.isSqlDroidUrl(jdbcConnectionUrl)) { + || jdbcConfigurationBuilder.isSqlDroidUrl(jdbcConnectionUrl)) { guessedHibernateDialect = null; // H2 @@ -397,18 +397,18 @@ public class HibernateProvider { public Metadata getMetaData() { if (metaData == null) { - metaData = newMetaData(getHibernateConfiguration()); + metaData = newMetaData(getHibernateConfiguration(), getSessionFactory()); } return metaData; } - public Metadata newMetaData(Configuration configuration) { - return newMetaData(configuration, (Set) entityClasses); + public Metadata newMetaData(Configuration configuration, SessionFactory sessionFactory) { + return newMetaData(configuration, sessionFactory, (Set) entityClasses); } - public Metadata newMetaData(Configuration configuration, Collection<Class<?>> entityClasses) { + public Metadata newMetaData(Configuration configuration, SessionFactory sessionFactory, Collection<Class<?>> entityClasses) { - StandardServiceRegistry standardServiceRegistry = getStandardServiceRegistry(newSessionFactory(configuration)); + StandardServiceRegistry standardServiceRegistry = getStandardServiceRegistry(sessionFactory); MetadataSources sources = new MetadataSources(standardServiceRegistry); for (Class<?> persistanceClass : entityClasses) { String hbmXmlFile = persistanceClass.getName().replace('.', '/') + ".hbm.xml"; diff --git a/topia-service-migration/src/main/java/org/nuiton/topia/migration/TopiaMigrationEngine.java b/topia-service-migration/src/main/java/org/nuiton/topia/migration/TopiaMigrationEngine.java index b951d03..dc44058 100644 --- a/topia-service-migration/src/main/java/org/nuiton/topia/migration/TopiaMigrationEngine.java +++ b/topia-service-migration/src/main/java/org/nuiton/topia/migration/TopiaMigrationEngine.java @@ -30,6 +30,7 @@ import org.apache.commons.lang3.StringUtils; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.hibernate.Session; +import org.hibernate.SessionFactory; import org.hibernate.boot.Metadata; import org.hibernate.cfg.AvailableSettings; import org.hibernate.cfg.Configuration; @@ -130,62 +131,9 @@ public class TopiaMigrationEngine implements TopiaMigrationService { */ protected boolean showProgression; + protected SessionFactory sessionFactory; protected Metadata metaData; -// /** -// * delegate context listener. -// */ -// protected final TopiaSchemaListener contextListener; -// -// /** -// * delgate transaction listener -// */ -// protected final TopiaTransactionVetoable transactionVetoable; - - public TopiaMigrationEngine() { - - // comment everything, should be done in a common way in topia -// contextListener = new TopiaContextAdapter() { -// -// @Override -// public void postCreateSchema(TopiaContextEvent event) { -// if (log.isDebugEnabled()) { -// log.debug("postCreateSchema event called : will save version in database"); -// } -// saveApplicationVersion(); -// } -// -// @Override -// public void postUpdateSchema(TopiaContextEvent event) { -// if (log.isDebugEnabled()) { -// log.debug("postUpdateSchema event called : will save version in database"); -// } -// saveApplicationVersion(); -// } -// -// @Override -// public void postRestoreSchema(TopiaContextEvent event) { -// if (log.isDebugEnabled()) { -// log.debug("postRestoreSchema event detected, redo, schema migration"); -// } -// runSchemaMigration(); -// } -// }; -// -// transactionVetoable = new TopiaTransactionVetoable() { -// @Override -// public void beginTransaction(TopiaTransactionEvent event) { -// -// TopiaPersistenceContext context = event.getSource(); -// -// // add topia context listener -// context.getTopiaFiresSupport().addTopiaSchemaListener(contextListener); -// -// } -// }; - - } - //-------------------------------------------------------------------------- //-- TopiaService implementation //-------------------------------------------------------------------------- @@ -235,24 +183,15 @@ public class TopiaMigrationEngine implements TopiaMigrationService { HibernateProvider hibernateProvider = ((AbstractTopiaApplicationContext) applicationContext).getHibernateProvider(); - metaData = hibernateProvider.newMetaData(versionConfiguration, Collections.<Class<?>>singleton(TMSVersion.class)); + + sessionFactory = hibernateProvider.newSessionFactory(versionConfiguration); + + metaData = hibernateProvider.newMetaData(versionConfiguration,sessionFactory, Collections.<Class<?>>singleton(TMSVersion.class)); if (applicationContext.getConfiguration().isInitSchema() && TopiaUtil.isSchemaEmpty(versionConfiguration, metaData)) { TMSVersionHibernateDao.createTMSSchema(metaData); } -// if (!migrateOnInit) { -// -// // Lazy migration run, registering listeners -// if (log.isDebugEnabled()) { -// log.debug("No migration on init. Registering TopiaSchemaListener and TopiaTransactionVetoable to let " + -// "migration run when necessary"); -// } -// topiaApplicationContext.addTopiaSchemaListener(contextListener); -// topiaApplicationContext.addTopiaTransactionVetoable(transactionVetoable); -// -// } - init = true; if (log.isDebugEnabled()) { @@ -461,26 +400,6 @@ public class TopiaMigrationEngine implements TopiaMigrationService { log.debug("Detected version = " + dbVersion); } -// boolean createTable = !versionTableExist; -// // update version even if database has not been migrated -// // only case that database doesn't exist match this -// if (createTable) { -// // si la base n'etait pas versionnee, la table version n'existe pas -// // creation -// if (log.isDebugEnabled()) { -// log.debug("Adding tms_version table"); -// } -// -// // creer le schema en base -// // dans la configuration versionConfiguration, il n'y a que la table version -// TMSVersionHibernateDao.createTMSSchema(versionConfiguration); -// -// if (log.isDebugEnabled()) { -// log.debug("Table for " + TMSVersion.class.getSimpleName() + " created"); -// } -// } - - TopiaUtil.runInSession(versionConfiguration, new Function<Session, TMSVersion>() { @Override @@ -652,7 +571,9 @@ public class TopiaMigrationEngine implements TopiaMigrationService { @Override public void close() { - // nothing to do + if (sessionFactory!=null) { + sessionFactory.close(); + } } } -- To stop receiving notification emails like this one, please contact nuiton.org SCM administrator <admin+scm@nuiton.org>.