You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Quarkus 3集成JasperReports报错:无活动事务时使用已登记连接

Quarkus 3升级后JasperReports报表模块抛出SQLException问题

近期将应用升级至Quarkus 3后,报表模块开始崩溃,抛出异常:SQLException: Enlisted connection used without active transaction.

错误日志如下:

2024-07-22T21:24:13.597381608Z executor-thread-1 23 2024-07-22 23:24:13.558  ERROR net.sf.jasperreports.engine.fill.JRFillSubreport Fill 1: exception: net.sf.jasperreports.engine.JRException: Error preparing statement for executing the report query:

SELECT
    *
FROM
    MY_TABLE
ORDER BY
    col


 at net.sf.jasperreports.engine.query.JRJdbcQueryExecuter.createStatement(JRJdbcQueryExecuter.java:555)
 at net.sf.jasperreports.engine.query.JRJdbcQueryExecuter.createDatasource(JRJdbcQueryExecuter.java:299)
 at net.sf.jasperreports.engine.fill.JRFillDataset.createQueryDatasource(JRFillDataset.java:1317)
 at net.sf.jasperreports.engine.fill.JRFillDataset.initDatasource(JRFillDataset.java:767)
 at net.sf.jasperreports.engine.fill.BaseReportFiller.setParameters(BaseReportFiller.java:465)
 at net.sf.jasperreports.engine.fill.JRBaseFiller.fill(JRBaseFiller.java:585)
 at net.sf.jasperreports.engine.fill.BaseReportFiller.fill(BaseReportFiller.java:416)
 at net.sf.jasperreports.engine.fill.JRFillSubreport.fillSubreport(JRFillSubreport.java:827)
 at net.sf.jasperreports.engine.fill.JRSubreportRunnable.run(JRSubreportRunnable.java:61)
 at net.sf.jasperreports.engine.fill.AbstractThreadSubreportRunner.run(AbstractThreadSubreportRunner.java:221)
 at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1136)
 at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:635)
 at java.base/java.lang.Thread.run(Thread.java:840)
Caused by: java.sql.SQLException: Enlisted connection used without active transaction
 at io.agroal.pool.ConnectionHandler.verifyEnlistment(ConnectionHandler.java:398)
 at io.agroal.pool.wrapper.ConnectionWrapper.getMetaData(ConnectionWrapper.java:452)
 at net.sf.jasperreports.engine.query.OracleProcedureCallHandler.isOracle(OracleProcedureCallHandler.java:72)
 at net.sf.jasperreports.engine.query.JRJdbcQueryExecuter.isProcedureCall(JRJdbcQueryExecuter.java:566)
 at net.sf.jasperreports.engine.query.JRJdbcQueryExecuter.createStatement(JRJdbcQueryExecuter.java:389)
 ... 12 more

相关情况说明

  • 同一代码在Quarkus 2环境下运行正常
  • 使用JasperReports 7以适配Jakarta包
  • 事务在连接交付给Jasper引擎前处于活跃状态
  • 尝试在调用JasperFillManager前手动执行QuarkusTransaction.begin(),但触发“transaction already active”错误

已尝试的解决动作

查看源码发现JasperFillManager.fillReport是静态方法,怀疑导致事务丢失,尝试直接调用fill方法:

JasperFillManager manager = JasperFillManager.getInstance ( DefaultJasperReportsContext.getInstance() );
JasperPrint print = manager.fill(reportFile, parameters, con);

但仍出现相同错误。

请问该问题的原因是什么?恳请提供相关解决方案或思路,非常感谢!

内容的提问来源于stack exchange,提问作者SATISHEK

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.20 11:14:56