Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/335.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 异常后Eclipselink重试查询_Java_Postgresql_Jpa_Eclipselink - Fatal编程技术网

Java 异常后Eclipselink重试查询

Java 异常后Eclipselink重试查询,java,postgresql,jpa,eclipselink,Java,Postgresql,Jpa,Eclipselink,我正在使用JPA/Eclipselink连接到处于HA模式的PostgreSQL实例。当PostgreSQL的故障切换被触发时,当前主实例将启用只读模式。有时,我在故障切换的准确时刻收到一个PSQLException:由于管理员命令而导致的致命终止连接,同时插入一些数据。这是因为我也在使用连接池。重试同一语句时,它会在连接重新连接时再次工作。是否有避免这种情况的最佳做法?当然,我可以包装JPAEntityManager并构建某种重试机制。我还发现了一个异常处理程序[1],其中文档明确提到了查询的

我正在使用JPA/Eclipselink连接到处于HA模式的PostgreSQL实例。当PostgreSQL的故障切换被触发时,当前主实例将启用只读模式。有时,我在故障切换的准确时刻收到一个
PSQLException:由于管理员命令
而导致的致命终止连接,同时插入一些数据。这是因为我也在使用连接池。重试同一语句时,它会在连接重新连接时再次工作。是否有避免这种情况的最佳做法?当然,我可以包装JPA
EntityManager
并构建某种重试机制。我还发现了一个异常处理程序[1],其中文档明确提到了查询的重试:

使用类的handleException方法,该方法采用 java.lang.RuntimeException,用于:

重新抛出异常

抛出不同的异常

请重试查询或数据库操作

我还没有发现一个例子将
ExceptionHandler
与“重试查询或数据库操作”联系起来

问候


[1]

我通常在GitHub上的EclipseLink测试类中查找代码示例:。不过,您可能更想要的是重用EclipseLink已经在使用的现有重试机制(此处有所描述),并将您的错误作为一个数据库平台类标记包含为基于连接(请参阅wasFailureCommunicationBased,您可能需要在自定义平台类上重写它),感谢您将我指向测试。我已经找到了一个至少能让我了解如何处理的方法[1]。我使用的是
transaction type=“RESOURCE\u LOCAL”
,因此每个事务都由我控制。典型的persist类似于
EntityTransaction t=em.getTransaction();t、 begin();em.persist(实体);t、 提交()。我不确定是否能够在
ExceptionHandler
[1]中重试事务。另外,eclipselink的现有重试机制似乎也无法在异常发生时重试事务。至少我找不到与此相关的任何信息。它只能重试上一个语句/查询操作,而不能重试完整事务-我不相信它会为我运行完整事务,因为任何长时间运行的操作在最糟糕的时候都会异常长时间运行,当事情从它下面发生变化时,它会向失败敞开大门。我认为最好让上层获得异常,并根据需要重试操作