EJB3 DataSource DataSource.getConnection

时间:2014-12-01 12:52:01

标签: java database ejb-3.0

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

这个连接是(可能是分布式的)交易的一部分吗?每次我为同一个DataSource对象调用它时,getConnection()是否返回相同的Connection?我只知道使用本机SQL语句由同一个EntityManager使用Connections。

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

因此,服务的事务上下文如何与DataSource相关?

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

2 个答案:

答案 0 :(得分:6)

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

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

根据上述背景,您的问题可以解决,即:

  

在JDNI查找DataSource对象并调用DataSource.getConnection时使用了什么事务/连接。

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

  

这个连接是(可能是分布式的)交易的一部分吗?每当我为同一个DataSource对象调用它时,getConnection是否返回相同的Connection?

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

  

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

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

答案 1 :(得分:0)

查看@Resource注释的声明。

它包含shareable属性,允许您指定连接共享行为。它默认为true,这意味着如果您什么都不做,您将自动获得连接共享。

此属性也包含在您可以使用JNDI查找的任何resource-ref已定义数据源的XML架构中。

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