【问题标题】:Validate database schema programmatically in hibernate throws MySQLNonTransientConnectionException在休眠中以编程方式验证数据库架构抛出 MySQLNonTransientConnectionException
【发布时间】:2017-11-10 18:15:57
【问题描述】:

尝试以编程方式验证架构

@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);
    }

此方法尝试从 Configuration 类调用 schemaValidator 方法。

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。

请提出宝贵的建议。

【问题讨论】:

    标签: spring hibernate spring-boot database-schema


    【解决方案1】:

    是的,问题是架构验证失败时未关闭数据源

    【讨论】:

      猜你喜欢
      • 2011-01-20
      • 2014-08-02
      • 1970-01-01
      • 1970-01-01
      • 2011-07-12
      • 2012-02-21
      • 1970-01-01
      • 1970-01-01
      • 2023-03-13
      相关资源
      最近更新 更多