Java EJB3数据源DataSource.getConnection

Java EJB3数据源DataSource.getConnection,java,database,ejb-3.0,Java,Database,Ejb 3.0,在CMT J2EE环境(容器管理的事务)中,当我查找数据源对象并调用DataSource.getConnection时,使用了什么事务/连接 此连接是(潜在分布式)事务的一部分吗?getConnection()是否每次调用同一数据源对象时都返回相同的连接?我只知道同一个EntityManager使用本机SQL语句使用连接 这件事让我感到困惑。据我所知,SessionContext定义了一个事务系统,每次使用数据源时都会用到它。我的问题是,在会话bean中使用了DataSource.getConn

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

此连接是(潜在分布式)事务的一部分吗?
getConnection()
是否每次调用同一数据源对象时都返回相同的连接?我只知道同一个EntityManager使用本机SQL语句使用连接

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

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


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

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

在与数据库相关的数据源中,有多个层,第一层是由容器维护的受管连接池,第二层是数据库驱动程序与数据库的实际连接管理,在Java中,连接是与数据库的会话的抽象,而不是物理连接,这是由司机管理的

在上述背景下,您的问题可以解决,即:

在JDNI查找数据源对象并调用DataSource.getConnection时使用的事务/连接

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

此连接是(潜在分布式)事务的一部分吗?getConnection是否每次为同一数据源对象调用时都返回相同的连接

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

我的问题是,在会话bean中使用了DataSource.getConnection,然后关闭了该连接


在连接的池实现中,connection.close()没有影响,连接返回到池(),所有池的行为都类似。所以,尽管不应在容器管理的事务中关闭连接,但连接的关闭并不一定会使其与容器事务边界解除关联。类似地,不能从CMT内调用commit、setAutoCommit、rollback,因为这将发出与实际数据库等效的以下命令,并且此后事务的行为将未定义。

请查看注释的声明

它包含一个属性,允许您指定连接共享行为。它默认为
true
,这意味着您将在不执行任何操作的情况下自动获得连接共享

此属性还包括在XML模式中,用于任何
资源引用
定义的数据源,您可以使用JNDI查找这些数据源

调用期间包含的所有资源(JDBC、JMS、ResourceManager)都将注册到当前事务中。您有时可能需要指定XA的使用,以使其正常工作