Java 处理LocalSessionFactoryBean异常

Java 处理LocalSessionFactoryBean异常,java,spring,hibernate,datasource,sessionfactory,Java,Spring,Hibernate,Datasource,Sessionfactory,这是第一次,当我使用LocalSessionFactoryBean代替SessionFactory时,我遇到了一个问题:如果我的服务器无法连接到数据库,@Bean方法抛出一个异常,整个应用程序关闭。但这里有一件奇怪的事情:异常是在bean方法返回对象之后抛出的 @Bean LocalSessionFactoryBean sessionFactory() { LocalSessionFactoryBean sessionFactoryBean = new LocalSessionFacto

这是第一次,当我使用LocalSessionFactoryBean代替SessionFactory时,我遇到了一个问题:如果我的服务器无法连接到数据库,@Bean方法抛出一个异常,整个应用程序关闭。但这里有一件奇怪的事情:异常是在bean方法返回对象之后抛出的

@Bean
LocalSessionFactoryBean sessionFactory() {
    LocalSessionFactoryBean sessionFactoryBean = new LocalSessionFactoryBean();
    sessionFactoryBean.setDataSource(getDataSource());
    sessionFactoryBean.setPackagesToScan(Properties.hibernate.packages);
    sessionFactoryBean.setHibernateProperties(databaseSettings.getHibernateProperties());
    return sessionFactoryBean;
}
所以试着抓在这里不起作用。当Spring初始化bean时,它会自行运行sessionFactoryBean.afterPropertiesSet()方法。所以在那个时候异常是抛出的。毕竟我有下一个日志:

org.springframework.beans.factory.BeanCreationException: 
     Error creating bean with name 'sessionFactory' defined in class path resource [app/db/Hibernate.class]: 
     Invocation of init method failed; nested exception is 
     org.hibernate.exception.GenericJDBCException: Unable to open JDBC Connection for DDL execution

在这种情况下,处理db连接错误的最佳方法是什么?

我认为观察到的行为完全符合逻辑。您问题中提供的代码仅在内部配置
SessionFactory
。一旦返回结果
LocalSessionFactoryBean
(并被其他代码片段使用),就会尝试实际连接以这种方式配置的数据库

如果通过
getDataSource()
获取的配置的
DataSource
-在建立(第一个)连接时遇到错误,您将点击
org.hibernate.exception.genericjdbception
,如前所述

注意:对于细节,您必须提供更多的堆栈跟踪

作为应对措施,您可以在返回之前向上述代码片段添加以下“连接检查”:

@Bean
LocalSessionFactoryBean sessionFactory() {
    LocalSessionFactoryBean sessionFactoryBean = new LocalSessionFactoryBean();
    DataSource ds = getDataSource();
    sessionFactoryBean.setDataSource(ds);
    sessionFactoryBean.setPackagesToScan(Properties.hibernate.packages);
    sessionFactoryBean.setHibernateProperties(databaseSettings.getHibernateProperties());

    // conduct an early connection attempt which auto-closes the opened connection 
    try (Connection con = ds.getConnection(username, password)) {  
        // if you reach this line, connections to the DB can be established.
        return sessionFactoryBean;
    } catch (Exception ex {
        // handle exceptions with one or more of these steps
        // 1. log the problem to somewhere, console...
        // 2. re-try connection attempt?
        // 3. escalate by throwing a self-defined RuntimeException 
        // .. and shutdown the application in controlled manner? 
    }
}
有关参考信息,另请参见Oracle的《操作指南》

提示:您也可以考虑使用“PooDeDeloDeCurCE”,原因很多(参见上述数据源指南中的详细信息)。

希望能有帮助