同一JavaEE会话Bean中的Datasource和EntityManager
我正在使用带有最新jdbc驱动程序(未配置XA)的Wildfly 8.1和Postgres 9.2 如果我有这样一个会话Bean:同一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;
@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