gpt4 book ai didi

java - EJB3 数据源 DataSource.getConnection

转载 作者:搜寻专家 更新时间:2023-10-30 19:40:13 29 4
gpt4 key购买 nike

在 CMT J2EE 环境(容器管理的事务)中,当我 JDNI 查找 DataSource 对象并调用 DataSource.getConnection 时使用什么事务/连接?

这个连接是(潜在的分布式)交易的一部分吗? getConnection() 是否每次为同一个 DataSource 对象调用它时都返回同一个 Connection?我只知道通过使用 native SQL 语句的同一个 EntityManager 使用连接。

这让我很困惑。据我了解,SessionContext 定义了一个事务系统,每次我使用数据源时都会使用该系统。我遇到的问题是在 session bean 中使用了 DataSource.getConnection(),然后关闭了此连接。如果遇到问题,将发出 SessionContext.setForRollBack(true)

因此,服务的事务上下文如何与数据源相关联?

如果每次使用或至少查找数据源时我们都生成一个新的连接,那么我在理解我已经知道的事情时就会遇到问题。任何澄清都会很棒。我知道容器管理的事务和其他系统,但 DataSource 的实际行为完全超出了我的范围。

最佳答案

在 Java EE 中,事务不是数据库独有的概念,例如 JMS 连接 session 也可以是容器管理事务的一部分。这个想法是,如果一种或多种方法在容器管理的事务边界下运行,容器将根据需要提交或回滚事务。

在数据库相关的数据源中,有多个层次,首先是容器维护的管理连接池,其次是数据库驱动与数据库的实际连接管理,在Java中一个Connection是一个抽象对于与数据库而非物理连接的 session ,由驱动程序管理。

根据上述情况,您的问题可以得到解决,即:

what transaction / connection is used when I JDNI-lookup for a DataSource object and invoke DataSource.getConnection.

在容器管理的事务下,虽然它依赖于实现,但与数据库的连接/ session 相关联,并标记有事务边界。驱动程序可以与数据库共享实际的物理连接,但这对应用程序和容器都是透明的。

Is this connection part of the (potentially distributed) transaction? Does getConnection return the same Connection every time I call it for the same DataSource object?

引用上面,连接与驱动程序打开的数据库的底层套接字没有关系。它在逻辑上是一个单独的 session ,如果在事务边界内,同一 session 与从数据源检索到的连接相关联,如何实现是容器设计的一部分

I have the problem that inside a session bean a DataSource.getConnection is used and this connection is then closed

在连接的池化实现中,Connection.close() 没有影响,连接返回到池中(http://commons.apache.org/proper/commons-dbcp/api-1.3/org/apache/commons/dbcp/PoolableConnection.html),这种行为对于所有池都是相似的。因此关闭连接并不一定会解除它与容器事务边界的关联,尽管不应在容器管理的事务中关闭连接。同样,不能从 CMT 中调用 commit、setAutoCommit 和 rollback,因为这将发出与实际数据库等效的以下命令,并且之后的事务行为将未定义。

关于java - EJB3 数据源 DataSource.getConnection,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27228841/

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