Я начал преобразовывать свое выходящее приложение 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