[英]How can multiple Threads write to the database by using the same connection in java?
[英]How to get the same database connection as JPA used using Java?
我正在使用Jasper Reports来生成报告。
我正在使用临时表生成报告,我需要JPA使用相同的连接,同时创建临时表我如何实现相同。
可能你只有三步之遥。
您可以使用以下方式执行此操作
使用JTA数据源作为persistance.xml,如下所示
<persistence-unit name="sample"> <jta-data-source>java:comp/env/jdbc/DBConnectionDS</jta-data-source> .... </persistence-unit>
要生成报告,请从数据源检索connection
,如下所示
InitialContext initialContext = new InitialContext(); DataSource dataSource = (DataSource)initialContext.lookup("java:comp/env/jdbc/DBConnectionDS"); Connection connection = dataSource.getConnection();
使用连接生成如下所示的报告:
JasperPrint print = JasperFillManager.fillReport(report, parameters, connection);
这应该是我所相信的全部。 我们的想法是,使用JPA和JasperReport的通用JNDI连接,然后在适用的地方使用它们。
我没有使用JasperReports,但是使用BIRT报告并且没有任何问题地解决了这个问题。
在JasperReports中,您可以使用本机JDBC查询或EJBQL查询。
使用后者时,您的代码应如下所示(来自JRJpaQueryExecuter api):
Map parameters = new HashMap();
EntityManager em = emf.createEntityManager();
parameters.put(JRJpaQueryExecuterFactory.PARAMETER_JPA_ENTITY_MANAGER, em);
JasperRunManager.runReportToPdfFile(fileName, parameters);
如果您确实需要底层jdbc连接,那么实现它的方式会因您使用的JPA实现而异。
EclipseLink (JPA 2.0):
entityManager.getTransaction().begin();
java.sql.Connection connection = entityManager.unwrap(java.sql.Connection.class);
...
entityManager.getTransaction().commit();
(您不需要为报告开始和提交事务)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.