База данных Hibernate для каждого арендатора мультитенантного поставщика соединений создает несколько соединений с базой данных для одного арендатора - PullRequest
0 голосов
/ 28 мая 2019

Я хочу знать, как мультитенантный поставщик соединений hibernate обрабатывает соединения с базой данных для нескольких арендаторов в рамках подхода с несколькими арендаторами для отдельной базы данных.Если я использую API с тем же арендатором, скажем, 1234, то при первом обращении к нему следует подключиться к конкретной базе данных этого арендатора, а после нескольких обращений к одному и тому же арендатору, будет ли оно использовать то же соединение с базой данных, либо снова откроет новое соединение длятот же арендатор?

Я использовал AbstractDataSourceBasedMultiTenantConnectionProviderImpl и CurrentTenantIdentifierResolver реализации в базе данных для каждого подхода арендатора

class CurrentTenantIdentifierResolver {
    // Other methods + fields
    public String resolveCurrentTenantIdentifier() {        
      String tenantId = TenantContext.getCurrentTenant();       
      return tenantId;  
    }
}

class AbstractDataSourceBasedMultiTenantConnectionProviderImpl {
    // Other methods + fields

    @Override protected DataSource selectDataSource(String tenantIdentifier) {       
      return MultiTenantInitService.getDataSourceMap().get(tenantIdentifier);   
    }
}

class MultiTenantInitService {
    // Other methods + fields

    DriverManagerDataSource dataSource = new DriverManagerDataSource();
    dataSource.setDriverClassName(prop.getProperty("spring.jpa.properties.hibernate.driver-class-name"));
    dataSource.setUrl(prop.getProperty("spring.datasource.url"));
    dataSource.setUsername(prop.getProperty("spring.datasource.username"));
    dataSource.setPassword(prop.getProperty("spring.datasource.password"));
    dataSourceMap.put(ApplicationConstants.DEFAULT_TENANT_ID, dataSource);
}

Я ожидал, что мультитенантный провайдер подключится к базе данных при первом попадании APIдля одного арендатора только один раз.Не следует снова и снова открывать соединения для одного и того же арендатора.Новое соединение с базой данных должно быть сформировано только для нового арендатора.Но если он действительно открывает соединения, он также должен самостоятельно управлять закрытием соединения.

1 Ответ

0 голосов
/ 28 мая 2019

Я думаю, что вы хотите,

spring.datasource.max-active=1

Это свойство ограничивает максимальное количество активных соединений с вашей базой данных.Таким образом, вы можете установить это свойство в свой DataSource и использовать его.это означает, что у вас есть только одно соединение в пуле соединений.Но у этого подхода есть свои плюсы и минусы: если каким-либо образом соединение повреждено, вам придется работать над созданием другого соединения, чтобы снова работать с конкретным арендатором.Таким образом, есть довольно веские причины иметь пул соединений вместо одного соединения.Таким образом, лучшее решение будет иметь небольшой пул соединений в соответствии с вашими требованиями.Если ваше приложение постоянно обращается к базе данных, очевидно, что вам нужен пул соединений.Поэтому я бы посоветовал вам иметь небольшие пулы соединений на каждого арендатора.

spring.datasource.max-active=5
...