Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/apache-kafka/3.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
Jakarta ee JavaEE6JDBC连接粘性_Jakarta Ee_Java Ee 6 - Fatal编程技术网

Jakarta ee JavaEE6JDBC连接粘性

Jakarta ee JavaEE6JDBC连接粘性,jakarta-ee,java-ee-6,Jakarta Ee,Java Ee 6,我有一个通过数据源访问JDBC连接的简单DAO 当我在父业务EJB中同时调用operation1()和operation2()时,它实际上使用了池中的两个连接,这似乎会在大量调用时导致性能问题,因为池只有这么大 1) 我使用的连接必须是容器管理的。因此,打开EntityManager的连接不是一个选项 2) 在引擎盖下,正在使用EclipseLink 如何在不使用JDBC处理污染父业务EJB的情况下获得单个连接 @Stateless public class MyDAO { @Resou

我有一个通过数据源访问JDBC连接的简单DAO

当我在父业务EJB中同时调用operation1()和operation2()时,它实际上使用了池中的两个连接,这似乎会在大量调用时导致性能问题,因为池只有这么大

1) 我使用的连接必须是容器管理的。因此,打开EntityManager的连接不是一个选项

2) 在引擎盖下,正在使用EclipseLink

如何在不使用JDBC处理污染父业务EJB的情况下获得单个连接

@Stateless
public class MyDAO {
    @Resource(name = "jdbc/bla")
    private DataSource ds;

    public void operation1() {
        try (
            Connection connection = ds.getConnection();
            CallableStatement cs = connection.prepareCall(xxx);) {

        }
        ...
    }
    public void operation2() {
        try (
            Connection connection = ds.getConnection();
            CallableStatement cs = connection.prepareCall(yyy);) {

        }
        ...
    }
更改:

@Resource(name = "jdbc/bla")
private DataSource ds;
致:

然后在persistence.xml中定义一个映射到“myPU”的JTA数据源。该JTA数据源应该映射到指向JDBC连接池的JDBC资源。JDBC资源和JDBC连接池都将在EE6应用服务器中配置


通过该设置,您将拥有到数据源的连接池,当您从父EJB方法调用
operation1()
operation2()
时,它们将成为同一连接/事务的一部分。

谢谢。但是,如何在没有entityManager.unwrap(java.sql.connection.class)的情况下获得底层JDBC连接;然后我必须手动处理事务。出于好奇,您能详细说明为什么需要原始连接吗?这会给这件事增加一些有用的(至少对我来说)背景。此外,如果您正在使用JTA数据源,当您打开它时,它将与JPA处于相同的TX上下文中-这与使用和注入JTA数据源资源时的行为相同。我个人没有对此进行过测试,但从我所读到的内容来看,我相信当您使用这个未包装的JTA连接,或者在EE6中将JTA数据源注入CMT EJB时,您仍然可以获得CMT,并且不需要手动开始/提交TX。我使用的是Java EE 6,需要调用复杂的Oracle存储过程。我认为你是对的。我仔细检查了EclipseLink医生。似乎您只需要在不是JTA的情况下管理事务,这是有意义的。让我确认一下。谢谢
@PersistenceContext(unitName = "myPU")
private EntityManager em;