This is an automated email from the git hooks/post-receive script. New commit to branch develop-5.x in repository observe. See https://gitlab.nuiton.org/codelutin/observe.git commit d423f43af8ad2a80963f6c0df46438b1beb63165 Author: Tony CHEMIT <dev@tchemit.fr> Date: Wed Jan 18 20:08:59 2017 +0100 Le serveur ouvre une quantité astronomique de connexions (Fixes #8969) --- application-web/pom.xml | 6 ++- .../controller/v1/DataSourceServiceController.java | 14 +++++-- .../fr/ird/observe/ObserveTopiaConfiguration.java | 4 +- pom.xml | 2 +- .../ObserveTopiaApplicationContextFactory.java | 46 +++++++++++++++++----- 5 files changed, 55 insertions(+), 17 deletions(-) diff --git a/application-web/pom.xml b/application-web/pom.xml index eb6522a..a202e79 100644 --- a/application-web/pom.xml +++ b/application-web/pom.xml @@ -69,7 +69,11 @@ <artifactId>application-web-configuration</artifactId> <version>${project.version}</version> </dependency> - + <dependency> + <groupId>${project.groupId}</groupId> + <artifactId>services-topia</artifactId> + <version>${project.version}</version> + </dependency> <!-- commons dependencies --> <dependency> diff --git a/application-web/src/main/java/fr/ird/observe/application/web/controller/v1/DataSourceServiceController.java b/application-web/src/main/java/fr/ird/observe/application/web/controller/v1/DataSourceServiceController.java index 1dacb70..beda6c1 100644 --- a/application-web/src/main/java/fr/ird/observe/application/web/controller/v1/DataSourceServiceController.java +++ b/application-web/src/main/java/fr/ird/observe/application/web/controller/v1/DataSourceServiceController.java @@ -27,10 +27,10 @@ import fr.ird.observe.application.web.request.ObserveWebRequestContext; import fr.ird.observe.application.web.security.ObserveWebSecurityApplicationContext; import fr.ird.observe.services.configuration.ObserveDataSourceConfiguration; import fr.ird.observe.services.configuration.ObserveDataSourceConfigurationAndConnection; -import fr.ird.observe.services.configuration.rest.ObserveDataSourceConfigurationRest; import fr.ird.observe.services.configuration.ObserveDataSourceConnection; -import fr.ird.observe.services.configuration.rest.ObserveDataSourceConnectionRest; import fr.ird.observe.services.configuration.ObserveDataSourceInformation; +import fr.ird.observe.services.configuration.rest.ObserveDataSourceConfigurationRest; +import fr.ird.observe.services.configuration.rest.ObserveDataSourceConnectionRest; import fr.ird.observe.services.dto.DataSourceCreateConfigurationDto; import fr.ird.observe.services.dto.DataSourceCreateWithNoReferentialImportException; import fr.ird.observe.services.dto.IncompatibleDataSourceCreateConfigurationException; @@ -41,10 +41,12 @@ import fr.ird.observe.services.service.DataSourceService; import fr.ird.observe.services.service.DatabaseConnexionNotAuthorizedException; import fr.ird.observe.services.service.DatabaseDestroyNotAuthorizedException; import fr.ird.observe.services.service.DatabaseNotFoundException; +import fr.ird.observe.services.topia.ObserveTopiaApplicationContextFactory; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import java.io.File; +import java.util.LinkedHashSet; import java.util.Optional; import java.util.Set; @@ -99,8 +101,6 @@ public class DataSourceServiceController extends ObserveServiceControllerSupport @Override public void close() { - getAuthenticatedService().close(); - ObserveWebRequestContext requestContext = getRequestContext(); String authenticationToken = requestContext.getAuthenticationToken(); getSecurityApplicationContext().invalidateAuthenticationToken(authenticationToken); @@ -108,6 +108,12 @@ public class DataSourceServiceController extends ObserveServiceControllerSupport log.info("Invalidate authenticationToken: " + authenticationToken); } + Set<String> databaseAuthenticationTokens = new LinkedHashSet<>(); + for (ObserveDataSourceConfigurationAndConnection connection : getSecurityApplicationContext().getConfigurationByAuthenticationToken().values()) { + databaseAuthenticationTokens.add(connection.getConnection().getAuthenticationToken()); + } + + ObserveTopiaApplicationContextFactory.clearContexts(databaseAuthenticationTokens); } @Override diff --git a/entities/src/main/java/fr/ird/observe/ObserveTopiaConfiguration.java b/entities/src/main/java/fr/ird/observe/ObserveTopiaConfiguration.java index d5a8e41..c792353 100644 --- a/entities/src/main/java/fr/ird/observe/ObserveTopiaConfiguration.java +++ b/entities/src/main/java/fr/ird/observe/ObserveTopiaConfiguration.java @@ -43,8 +43,8 @@ public class ObserveTopiaConfiguration extends BeanTopiaConfiguration { this.h2Configuration = h2Configuration; hibernateExtraConfiguration.put(HibernateAvailableSettings.CONNECTION_PROVIDER, HikariCPConnectionProvider.class.getName()); - hibernateExtraConfiguration.put("hibernate.hikari.minimumIdle", "2"); - hibernateExtraConfiguration.put("hibernate.hikari.maximumPoolSize", "20"); + hibernateExtraConfiguration.put("hibernate.hikari.minimumIdle", "1"); + hibernateExtraConfiguration.put("hibernate.hikari.maximumPoolSize", "10"); hibernateExtraConfiguration.put("hibernate.hikari.autoCommit", "false"); hibernateExtraConfiguration.put("hibernate.hikari.registerMbeans", "true"); diff --git a/pom.xml b/pom.xml index 9df0def..1730bcd 100644 --- a/pom.xml +++ b/pom.xml @@ -159,7 +159,7 @@ <eugenePluginVersion>3.0-alpha-10</eugenePluginVersion> <processorPluginVersion>1.3</processorPluginVersion> - <topiaVersion>3.2</topiaVersion> + <topiaVersion>3.2.1</topiaVersion> <jaxxVersion>2.39</jaxxVersion> <nuitonI18nVersion>3.6.2</nuitonI18nVersion> <nuitonValidatorVersion>3.1</nuitonValidatorVersion> diff --git a/services-topia/src/main/java/fr/ird/observe/services/topia/ObserveTopiaApplicationContextFactory.java b/services-topia/src/main/java/fr/ird/observe/services/topia/ObserveTopiaApplicationContextFactory.java index 80ba557..9b4f2b2 100644 --- a/services-topia/src/main/java/fr/ird/observe/services/topia/ObserveTopiaApplicationContextFactory.java +++ b/services-topia/src/main/java/fr/ird/observe/services/topia/ObserveTopiaApplicationContextFactory.java @@ -38,6 +38,8 @@ import java.util.LinkedHashSet; import java.util.Map; import java.util.Objects; import java.util.Optional; +import java.util.Set; +import java.util.stream.Collectors; /** * Usine de contexte applicatif ToPIA. @@ -104,25 +106,51 @@ public class ObserveTopiaApplicationContextFactory { } + public static void clearContexts(Set<String> usedTokens) { + + Set<ObserveDataSourceConfigurationTopiaSupport> unusedConfigurations = TOPIA_APPLICATION_CONTEXT_CACHE.entrySet() + .stream() + .filter(e -> !usedTokens.contains(e.getValue().getAuthenticationToken())) + .map(Map.Entry::getKey) + .collect(Collectors.toSet()); + for (ObserveDataSourceConfigurationTopiaSupport unusedConfiguration : unusedConfigurations) { + + ObserveTopiaApplicationContext topiaApplicationContext = TOPIA_APPLICATION_CONTEXT_CACHE.get(unusedConfiguration); + if (log.isInfoEnabled()) { + log.info("Remove unsued topia application context for: " + unusedConfiguration); + } + close(topiaApplicationContext); + TOPIA_APPLICATION_CONTEXT_CACHE.remove(unusedConfiguration); + } + + if (log.isInfoEnabled()) { + log.info("Still using " + TOPIA_APPLICATION_CONTEXT_CACHE.size() + " topia application context(s)."); + } + } + public static void close() { for (TopiaApplicationContext topiaApplicationContext : new LinkedHashSet<>(TOPIA_APPLICATION_CONTEXT_CACHE.values())) { - if (!topiaApplicationContext.isClosed()) { - try { - topiaApplicationContext.close(); - } catch (Exception e) { - if (log.isErrorEnabled()) { - log.error("Could not close topiaApplicationContext: " + topiaApplicationContext, e); - } - } - } + close(topiaApplicationContext); } TOPIA_APPLICATION_CONTEXT_CACHE.clear(); } + protected static void close(TopiaApplicationContext topiaApplicationContext) { + if (!topiaApplicationContext.isClosed()) { + try { + topiaApplicationContext.close(); + } catch (Exception e) { + if (log.isErrorEnabled()) { + log.error("Could not close topiaApplicationContext: " + topiaApplicationContext, e); + } + } + } + } + public static ObserveTopiaConfiguration createTopiaConfiguration(ObserveDataSourceConfigurationTopiaPG configuration, boolean initSchema) { ObserveTopiaConfiguration topiaConfiguration = ObserveTopiaConfigurationFactory.forPostgresqlDatabase( -- To stop receiving notification emails like this one, please contact codelutin.com SCM administrator <admin+scm@codelutin.com>.