Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/368.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
同一JavaEE会话Bean中的Datasource和EntityManager_Java_Jakarta Ee_Jboss_Ejb_Wildfly - Fatal编程技术网

同一JavaEE会话Bean中的Datasource和EntityManager

同一JavaEE会话Bean中的Datasource和EntityManager,java,jakarta-ee,jboss,ejb,wildfly,Java,Jakarta Ee,Jboss,Ejb,Wildfly,我正在使用带有最新jdbc驱动程序(未配置XA)的Wildfly 8.1和Postgres 9.2 如果我有这样一个会话Bean: @Stateless public class MySessionBean { @Resource(lookup="jdbc/mydb") Datasource ds; @PersistenceContext // defaults to datasource lookup name "jdbc/mydb" EntityManager em;

我正在使用带有最新jdbc驱动程序(未配置XA)的Wildfly 8.1和Postgres 9.2

如果我有这样一个会话Bean:

@Stateless
public class MySessionBean {
  @Resource(lookup="jdbc/mydb")
  Datasource ds;

  @PersistenceContext // defaults to datasource lookup name "jdbc/mydb"
  EntityManager em;

  public void method1() {
    // will ds.getConnection() and 
    // the underlying connection used by em be the same?
  }
}
ds.getConnection()
是否与EntityManager(
em
)在
method1()的方法调用中使用的底层连接相同

如果它们共享同一个jta事务,我怎么不需要XA数据源而只需要一个常规数据源呢?(假设数据源的查找名称也是EntityManager的默认数据源)

我在EJB3.1规范中找不到相关性


除了这个问题,我知道我需要自己关闭数据源连接,但是事务将由容器管理(如果我错了,请纠正我)

我认为连接不同。据我所知,您将在应用服务器管理的同一个池上获得2个不同的连接


如果是这样,您就不能在2个连接之间共享一个简单的事务。您必须在两个资源之间共享事务管理器,因此使用XA。

使用ds测试更新数据非常容易。连接并使用jpql查询绕过EM缓存请求它,如果更新可见,那么您将共享连接/事务。但是,我认为容器至少应该警告您,如果您对其管理的资源有错误。在这种情况下,我使用的是wildfly 8.1服务器,它可以正常工作(使用非XA数据源),就像它们在同一个jta事务中一样(不确定它们是否共享同一个连接,但我会找到答案)afak数据源的事务管理委托给底层DBMS,您不能在多个连接之间共享事务。一些数据库管理系统提供了这样做的功能(例如sqlServer),但我很确定JTA级别不支持它。如果JSR在这方面不清楚,它取决于底层的app server实现,似乎在wildfly上提供了相同的连接在这种情况下是相同的连接,我用EntityManager插入了一个实体,然后使用new InitialContext().lookup()方法获得了一个新连接,jdbc连接可以看到刚刚插入的实体,但是从我的psql命令行中我仍然看不到它。所以(奇怪的东西刚刚起作用,我不明白为什么这是正确的…)我编辑了这个问题,显示我正在使用wildfly和postgres