Spring Boot LocalContainerEntityManagerFactoryBean не закрывает соединение - PullRequest
0 голосов
/ 21 января 2019

Я начал преобразовывать свое выходящее приложение Spring Boot (1.5.4.RELEASE) для работы с мультитенантными функциями. Это мультитенантное решение на основе схемы, основанное на mysql.Как показано в документе гибернации, предложенном ниже

https://docs.jboss.org/hibernate/orm/4.2/devguide/en-US/html/ch16.html

, я реализовал интерфейсы MultiTenantConnectionProvider и CurrentTenantIdentifierResolver, и он работает нормально; ниже приведена моя конфигурация гибернации

@Configuration
public class HibernateConfig {

  @Autowired
  private JpaProperties jpaProperties;

  @Bean
  public JpaVendorAdapter jpaVendorAdapter() {
    return new HibernateJpaVendorAdapter();
  }

  @Bean
  public LocalContainerEntityManagerFactoryBean 
    entityManagerFactory(DataSource dataSource,
    MultiTenantConnectionProvider multiTenantConnectionProviderImpl,
    CurrentTenantIdentifierResolver currentTenantIdentifierResolverImpl) {
     Map<String, Object> properties = new HashMap<>();
     properties.putAll(jpaProperties.getHibernateProperties(dataSource));
     properties.put(Environment.MULTI_TENANT, MultiTenancyStrategy.SCHEMA);
     properties.put(Environment.MULTI_TENANT_CONNECTION_PROVIDER, multiTenantConnectionProviderImpl);
     properties.put(Environment.MULTI_TENANT_IDENTIFIER_RESOLVER, currentTenantIdentifierResolverImpl);

     LocalContainerEntityManagerFactoryBean em = new 
             LocalContainerEntityManagerFactoryBean();
     em.setDataSource(dataSource);
     em.setPackagesToScan("com.ifi.aws");
     em.setJpaVendorAdapter(jpaVendorAdapter());
     em.setJpaPropertyMap(properties);
    return em;
 }
}

Позже, когда яначалось тестирование, началось завершение с ошибкой, указанной ниже:

Мультитенант Springboot с MultiTenantConnectionProvider всегда выбрасывает org.apache.tomcat.jdbc.pool.PoolExhaustedException: [http-nio-8086-exec-2] Время ожидания: Пул пуст.Невозможно получить соединение в течение 30 секунд, недоступно [размер: 100;занят: 100;холостой ход: 0;lastwait: 30000].

Я немного изучил фон, и он предложил использовать hibernate.connection.release_mode для "after_transaction", однако это не сработало.Потом была еще одна публикация, в которой говорится, что поскольку я создаю новый Entity Manager из Entity Manager Factory Spring, он больше не управляет этим.

https://github.com/brettwooldridge/HikariCP/issues/1238

Для проверки утечки соединения ятолько что написал простой класс с аспектом.

Aspect

@ Открытый класс компонента DataSourceAspectLogger {

protected final Logger logger = LoggerFactory.getLogger(this.getClass());

@Autowired
private DataSource ds;

@Before("execution(* com.ifi.aws.*.dao.impl.springData.*.*(..))")
public void logBeforeConnection(JoinPoint jp) throws Throwable {
    logDataSourceInfos("Before", jp);
}

@After("execution(* com.ifi.aws.*.dao.impl.springData.*.*(..)) ")
public void logAfterConnection(JoinPoint jp) throws Throwable {
    logDataSourceInfos("After", jp);
}

public void logDataSourceInfos(final String time, final JoinPoint jp) {
    final String method = String.format("%s:%s", jp.getTarget().getClass().getName(), jp.getSignature().getName());
    logger.debug("--------------------------------------------------------------------------");
    logger.debug(String.format("%s %s: number of connections in use by the application (active): %d.", time, method, ds.getNumActive()));
    logger.debug(String.format("%s %s: the number of established but idle connections: %d.", time, method, ds.getNumIdle()));
    logger.debug(String.format("%s %s: number of threads waiting for a connection: %d.", time, method, ds.getWaitCount()));
}

}

И результат выглядит следующим образом

After com.sun.proxy.$Proxy125:findByUserName: number of connections in use by the application (active): 12.
After com.sun.proxy.$Proxy125:findByUserName: the number of established but idle connections: 0.
After com.sun.proxy.$Proxy125:findByUserName: number of threads waiting for a connection: 0.

и он постоянно увеличивает количество активных соединений, пока не достигнет максимального числа активных соединений для пула, равного 100, и вылетает.

Ребята, у вас есть идеи?

Спасибо, KElum

...