Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 连接丢失后自动重新连接JPA EntityManager_Java_Spring_Hibernate_Postgresql_Jpa - Fatal编程技术网

Java 连接丢失后自动重新连接JPA EntityManager

Java 连接丢失后自动重新连接JPA EntityManager,java,spring,hibernate,postgresql,jpa,Java,Spring,Hibernate,Postgresql,Jpa,我有一个EntityManager bean对象,在服务类中称为autowired对象 Spring配置类: @EnableWebMvc @Configuration("myWebConfiguration") @ComponentScan(basePackages = {"org.my.app"}) @EnableScheduling public class MyWebConfiguration extends WebMvcConfigurerAdapter { .... pri

我有一个EntityManager bean对象,在服务类中称为autowired对象

Spring配置类:

@EnableWebMvc
@Configuration("myWebConfiguration")
@ComponentScan(basePackages = {"org.my.app"})
@EnableScheduling
public class MyWebConfiguration extends WebMvcConfigurerAdapter {

....

    private static EntityManager entityManager; 

    @Bean
    public EntityManager entityManager() {
        if (entityManager == null) {
            entityManager = managerFactoryBean().getObject().createEntityManager();
        }
        return entityManager;
    }    

服务类别示例:

@Service("sampleService")
public class SampleService {

    @Autowired
    protected EntityManager entityManager;

    public Object find(Class entityClass, Object id) {
        return entityManager.find(entityClass, id);
    }

    ....

}
问题是:

如果WebApp服务器和DB服务器之间的连接丢失,JPA和spring无法重新连接到DB服务器,调用entityManager方法会导致异常,例如
org.postgresql.util.PSQLException:此连接已关闭。
org.hibernate.exception.jdbconnectionexception:无法检查JDBC自动提交模式


是否可以自动检测连接丢失并在连接丢失的情况下重新建立连接?

这是可能的,并且是由连接池(或支持连接池的数据源)库履行的职责

例如,如果使用,可以设置参数,如
validationQuery=“SELECT 1”
testOnBorrow=“true”
,以检测连接状态并在需要时重新打开

类似地,允许使用
c3p0.testConnectionOnCheckout=true等配置此类参数

其他连接池库将公开类似的配置

如果您已经在使用连接池库(或使用连接池的数据源),则可能需要检查其文档以获取要设置的相关配置属性。如果不是,您可能需要考虑使用连接池或使用连接池的数据源并公开这些参数。 更新: 对于c3p0,您可以添加以下属性和测试:

properties.setProperty("hibernate.c3p0.preferredTestQuery","SELECT 1");
properties.setProperty("hibernate.c3p0.testConnectionOnCheckout","true");

谢谢,我在答案中添加了hibernate属性部分。我使用c3p0,但我没有它的配置。我需要添加哪个配置?@BabakBehzadi用c3p0的属性更新了答案。你能试试吗。
properties.setProperty("hibernate.c3p0.preferredTestQuery","SELECT 1");
properties.setProperty("hibernate.c3p0.testConnectionOnCheckout","true");