在CMT J2EE环境(容器管理事务)中,当我使用JDNI查找DataSource对象并调用DataSource.getConnection时,使用哪个事务/连接
这个连接是(潜在的分布式)事务的一部分吗?每次我为相同的DataSource对象调用getConnection()时,它会返回相同的连接吗?我只知道使用原生SQL语句通过相同的EntityManager使用连接。
这是一件让我困惑的事情。据我所知,SessionContext定义了一个事务性系统,我每次使用数据源时都会使用它。我有一个问题,在会话bean中使用了DataSource.getConnection(),然后这个连接就关闭了。如果遇到问题,则发出SessionContext.setForRollBack(true)。
因此,服务的事务上下文如何与DataSource相关?
如果我们每次使用数据源或至少查找数据源时都会产生一个新的连接,那么我就无法理解我已经知道的东西。任何澄清都会很棒。我知道容器管理事务和其他系统,但DataSource的实际行为完全超出了我的理解。
发布于 2014-12-04 17:52:32
在Java EE中,事务是一个不是数据库独有的概念,例如,JMS连接会话也可以是容器管理事务的一部分。这个想法是,如果一个或多个方法在容器管理的事务边界下运行,容器将根据需要提交或回滚事务。
在与数据库相关的数据源中,有多个层次,一是由容器维护的连接池,二是数据库驱动程序与数据库的实际连接管理,在Java中,连接是与数据库的会话的抽象,而不是物理连接,由驱动程序管理。
在上述情况下,您的问题可以通过以下方式解决:
当我使用JDNI查找DataSource对象并调用DataSource.getConnection时,使用的是什么事务/连接。
在容器管理的事务下,尽管它是依赖于实现的,但与数据库的连接/会话是关联的,该连接/会话标记有事务边界。实际的物理连接可以由驱动程序与数据库共享,但这对应用程序和容器都是透明的。
这个连接是(潜在的分布式)事务的一部分吗?每次我为相同的DataSource对象调用getConnection时,它会返回相同的连接吗?
如上所述,连接与驱动程序打开的数据库的底层套接字无关。它在逻辑上是一个单独的会话,如果在事务边界内,相同的会话与从数据源检索的连接相关联,这是容器设计的一部分。
我遇到这样的问题:在会话bean中使用DataSource.getConnection,然后关闭此连接
在连接的池化实现中,Connection.close()没有影响,连接被返回到池(http://commons.apache.org/proper/commons-dbcp/api-1.3/org/apache/commons/dbcp/PoolableConnection.html),这种行为对所有池都是相似的。因此,尽管连接不应该在容器管理的事务中关闭,但连接不一定会从容器事务边界中分离出来。类似地,commit、setAutoCommit、rollback不能从CMT内部调用,因为这将发出与实际数据库等效的以下命令,并且之后事务的行为将是未定义的。
https://stackoverflow.com/questions/27228841
复制相似问题