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
相关产品推荐
相关产品推荐

