Проверка схемы базы данных программно в Hibernate бросает MySQLNonTransientConnectionException
Попытка проверить схему программно
@Autowired
LocalContainerEntityManagerFactoryBean localContainerEntityManagerFactoryBean;
// код для получения конфигурации гибернации
private Configuration getHibernateConfiguration() {
final PersistenceUnitInfo persistenceUnitInfo = localContainerEntityManagerFactoryBean.getPersistenceUnitInfo();
final Map<String, Object> jpaPropertyMap = localContainerEntityManagerFactoryBean.getJpaPropertyMap();
EntityManagerFactoryBuilderImpl builder = new EntityManagerFactoryBuilderImpl(new PersistenceUnitInfoDescriptor(persistenceUnitInfo), jpaPropertyMap) {
@Override
public Configuration buildHibernateConfiguration(ServiceRegistry serviceRegistry) {
Configuration configuration = super.buildHibernateConfiguration(serviceRegistry);
if (persistenceUnitInfo instanceof SmartPersistenceUnitInfo) {
for (String managedPackage : ((SmartPersistenceUnitInfo) persistenceUnitInfo).getManagedPackages()) {
configuration.addPackage(managedPackage);
}
}
return configuration;
}
};
serviceRegistry = builder.buildServiceRegistry();
return builder.buildHibernateConfiguration(serviceRegistry);
}
Этот метод пытается вызвать метод schemaValidator из класса Configuration.
public void getSchemaValidationService(DataSource dataSource) {
Properties hibernateProperties = new Properties();
hibernateProperties.setProperty("hibernate.dialect", hibernateDialect);
Dialect dialect = Dialect.getDialect(hibernateProperties);
Configuration configuration = getHibernateConfiguration(dataSource);
Connection connection = null;
try {
connection = dataSource().getConnection();
DatabaseMetadata metadata = new DatabaseMetadata(connection, dialect, configuration);
configuration.validateSchema(dialect, metadata);
} catch (SQLException e) {
throw new RuntimeException(e);
} finally {
if (connection != null) {
try {
new SqlExceptionHelper().logAndClearWarnings( connection );
connection.setAutoCommit( false );
connection.close();
logger.error("Connection Closed : "+connection.isClosed() );
connection = null;
StandardServiceRegistryBuilder.destroy(serviceRegistry);
} catch (SQLException e) {
logger.error("Datasource connection failed to close");
}
}
}
}
Использование режима гибернации в мультитенантном режиме, поэтому попытка программной проверки схемы.
Проверка схемы работает отлично, но через несколько минут она пытается бросить
MySQLNonTransientConnectionException в случае сбоя проверки.
Любые ценные предложения, пожалуйста.
1 ответ
Да, проблема заключалась в том, что источник данных не был закрыт при сбое проверки схемы