gpt4 book ai didi

java - glassfish 抛出 org.postgresql.xa.PGXAException

转载 作者:塔克拉玛干 更新时间:2023-11-03 05:32:29 26 4
gpt4 key购买 nike

我对J2EE不是很熟悉,所以在解释错误时可能会犯一些错误。请耐心等待。

我正在尝试对我的 Java 企业应用程序运行查询,但 glassfish 抛出以下异常:

[#|2014-12-05T15:31:00.412+0200|WARNING|glassfishv3.0|javax.enterprise.system.core.transaction.com.sun.jts.CosTransactions|_ThreadID=86;_ThreadName=Thread-1;|JTS5031: Exception [java.lang.RuntimeException: org.postgresql.xa.PGXAException: Error preparing transaction] on Resource [prepare] operation.|#]

[#|2014-12-05T15:31:00.413+0200|SEVERE|glassfishv3.0|javax.enterprise.system.core.transaction.com.sun.jts.CosTransactions|_ThreadID=86;_ThreadName=Thread-1;|JTS5031: Exception [org.omg.CORBA.INTERNAL: vmcid: 0x0 minor code: 0 completed: Maybe] on Resource [rollback] operation.|#]

[#|2014-12-05T15:31:00.439+0200|WARNING|glassfishv3.0|javax.enterprise.system.container.ejb.com.sun.ejb.containers|_ThreadID=86;_ThreadName=Thread-1;|A system exception occurred during an invocation on EJB OFReportTimeoutService method public void com.companyname.appname.service.OFReportTimeoutService.ofTimeout()
javax.ejb.EJBException: Unable to complete container-managed transaction.
at com.sun.ejb.containers.BaseContainer.completeNewTx(BaseContainer.java:4962)
at com.sun.ejb.containers.BaseContainer.postInvokeTx(BaseContainer.java:4716)
at com.sun.ejb.containers.BaseContainer.postInvoke(BaseContainer.java:1941)
at com.sun.ejb.containers.BaseContainer.postInvoke(BaseContainer.java:1892)
at com.sun.ejb.containers.EJBLocalObjectInvocationHandler.invoke(EJBLocalObjectInvocationHandler.java:198)
at com.sun.ejb.containers.EJBLocalObjectInvocationHandlerDelegate.invoke(EJBLocalObjectInvocationHandlerDelegate.java:84)
at com.sun.proxy.$Proxy307.ofTimeout(Unknown Source)
at com.companyname.appname.service.__EJB31_Generated__OFReportTimeoutService__Intf____Bean__.ofTimeout(Unknown Source)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:606)
at com.companyname.appname.servlet.GFv3EJBInvokerJob.execute(GFv3EJBInvokerJob.java:88)
at org.quartz.core.JobRunShell.run(JobRunShell.java:213)
at org.quartz.simpl.SimpleThreadPool$WorkerThread.run(SimpleThreadPool.java:557)
Caused by: javax.transaction.SystemException: org.omg.CORBA.INTERNAL: JTS5031: Exception [org.omg.CORBA.INTERNAL: vmcid: 0x0 minor code: 0 completed: Maybe] on Resource [rollback] operation. vmcid: 0x0 minor code: 0 completed: No
at com.sun.jts.jta.TransactionManagerImpl.commit(TransactionManagerImpl.java:330)
at com.sun.enterprise.transaction.jts.JavaEETransactionManagerJTSDelegate.commitDistributedTransaction(JavaEETransactionManagerJTSDelegate.java:169)
at com.sun.enterprise.transaction.JavaEETransactionManagerSimplified.commit(JavaEETransactionManagerSimplified.java:843)
at com.sun.ejb.containers.BaseContainer.completeNewTx(BaseContainer.java:4951)
... 14 more
|#]

另一个具有相同版本的glassfishpostgresql 和web 应用程序的系统没有抛出任何异常。它们都有相同的 domain.xmlpostgresql.conf 文件。

我已将 max_prepared_transactions100 更改为 10000 并将 shared_buffers32MB320MB 但它不起作用。

有什么想法吗?

编辑 ofTimeout 添加代码。

@Startup
@Singleton(mappedName="OFReportTimeoutService")
public class OFReportTimeoutService {

@EJB
protected QueueManagerService queueManagerService;

@EJB
protected AnalyzerService analyzerService;

@EJB
protected ErrorReportJpaController errorReportJpaController;

@EJB
protected ReportJpaController reportJpaController;

protected Boolean isProcessing = Boolean.FALSE;

private Boolean exceptionPresent = Boolean.FALSE;
private String errorText = "error";
private Integer reportId = 0;

//@Schedule(second="*/10", minute="*", hour="*", persistent=false)
public void ofTimeout() {
//System.out.println("STATE : " + "OfReportTimeOutService is running...") ;
if(exceptionPresent) {
ErrorReport errorReport = errorReportJpaController.create();
errorReport.setErrorDate(new Date());
errorReport.setErrorText(errorText);
errorReport.setReport(reportJpaController.find(reportId));
errorReportJpaController.persist(errorReport);
exceptionPresent = Boolean.FALSE;
if (queueManagerService.getLastReport() != null)
queueManagerService.resetLastReport();
isProcessing = Boolean.FALSE;
}

if (isProcessing)
return;

if (queueManagerService.reportQueueSize() > 0)
isProcessing = Boolean.TRUE;
else {
//System.out.println("STATE : " + "queueManagerService.reportQueueSize == 0 !!!") ;
return;
}

while (queueManagerService.reportQueueSize() > 0)
try {
Report report = queueManagerService.pullReport();
reportId = report.getId();
if ( reportId != null )
System.out.println("STATE : " + "reportId var") ;
analyzerService.process(report);
} catch (ReportJPAException rex) {
Logger.getLogger(OFReportTimeoutService.class.getName()).log(Level.SEVERE, null, rex);
exceptionPresent = Boolean.TRUE;
errorText = rex.toString();
break;
} catch (RuntimeException rex) {
Logger.getLogger(OFReportTimeoutService.class.getName()).log(Level.SEVERE, null, rex);
exceptionPresent = Boolean.TRUE;
errorText = rex.toString();
break;
} catch (Exception ex) {
Logger.getLogger(OFReportTimeoutService.class.getName()).log(Level.SEVERE, null, ex);
exceptionPresent = Boolean.TRUE;
errorText = ex.toString();
break;
}

if(exceptionPresent) {
return;
}

isProcessing = Boolean.FALSE;
queueManagerService.resetLastReport();


}

public Boolean isProcessing() {
return isProcessing;
}

public void setProcessing(Boolean isProcessing) {
this.isProcessing = isProcessing;
}

}

最佳答案

我已经解决了这个问题。我们正在使用 bucardo 来复制我们的 postgresql 数据库。这就是我遇到问题的原因。在 postgresql 日志中,我看到了这样的错误日志:

ERROR:  cannot PREPARE a transaction that has executed LISTEN, UNLISTEN or NOTIFY

this blog post问题原因已说明:

The problem is that the Postgres LISTEN/NOTIFY system cannot be used with prepared transactions. Bucardo uses a trigger on the source tables that issues a NOTIFY to let the main Bucardo daemon know that something has changed and needs to be replicated. However, their application was issuing a PREPARE TRANSACTION as an occasional part of its work. Thus, they would update the table, which would fire the trigger, which would send the NOTIFY. Then the application would issue the PREPARE TRANSACTION which produced the error given above. Bucardo is setup to deal with this situation; rather than using notify triggers, the Bucardo daemon can be set to look for any changes at a set interval. The steps to change Bucardo's behavior for a given sync is simply:

博文中的解决方案对我们不起作用。我们可以承受不复制导致错误的数据库。因此,我们使用以下命令删除了复制:

[root@Baskan config]# bucardo deactivate synclrms
Deactivating sync synclrms

[root@Baskan config]# bucardo purge synclrms
Purging name synclrms

[root@Baskan config]# bucardo remove sync synclrms
Removed sync "synclrms"
Note: table triggers (if any) are not automatically removed!

由于触发器不会自动删除,因此应手动删除它们:在我们的例子中,有三个触发器。他们的名字是:bucardo_delta、bucardo_kick_synclrms、bucardo_note_trunc_synclrmsbucardo_note_trunc_synclrms

要删除触发器,请使用以下命令:

drop TRIGGER trigger_name on table_name;

以防万一bucardo放置的表上可能有其他触发器,您可以在postgresql中使用以下命令查看表上的所有触发器:

\dS table_name;

完成这些步骤后,系统开始正常工作,没有抛出任何异常。

关于java - glassfish 抛出 org.postgresql.xa.PGXAException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27318722/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com