Java 连接丢失后自动重新连接JPA EntityManager
我有一个EntityManager bean对象,在服务类中称为autowired对象 Spring配置类: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
@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");