相关疑难解决方法(0)

@Resource UserTransaction和EntityManager.getTransaction()之间有什么区别

谁能解释一下有什么区别:

@Resource
UserTransaction objUserTransaction;
Run Code Online (Sandbox Code Playgroud)

EntityManager.getTransaction();
Run Code Online (Sandbox Code Playgroud)

什么是容器管理交易?如果我想在事务中的表中插入三行,我应该如何在会话外观中执行此操作.

java jpa jta java-ee

30
推荐指数
2
解决办法
3万
查看次数

"本地事务已经有1个非XA资源:无法添加更多资源"错误

在阅读了有关此错误的先前问题后,似乎所有人都认为您需要在所有数据源上启用XA.但:

  1. 如果我不想要分布式事务怎么办?我会怎么做,如果我想在同一时间开始在两个不同的数据库的事务,但在一个数据库提交事务和其他事务回滚?
  2. 我想知道我的代码是如何实际启动分布式事务的.在我看来,我在每个数据库上开始完全独立的事务.

有关应用程序的信息:

该应用程序是在Sun Java Application Server 9.1上运行的EJB

我使用类似下面的spring上下文来设置hibernate会话工厂:

<bean id="dbADatasource" class="org.springframework.jndi.JndiObjectFactoryBean">
    <property name="jndiName" value="jdbc/dbA"/>
</bean>

<bean id="dbASessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
    <property name="dataSource" ref="dbADatasource" />
    <property name="hibernateProperties">
        hibernate.dialect=org.hibernate.dialect.Oracle9Dialect
        hibernate.default_schema=schemaA
    </property>
    <property name="mappingResources">
        [mapping resources...]
    </property>
</bean>

<bean id="dbBDatasource" class="org.springframework.jndi.JndiObjectFactoryBean">
    <property name="jndiName" value="jdbc/dbB"/>
</bean>

<bean id="dbBSessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
    <property name="dataSource" ref="dbBDatasource" />
    <property name="hibernateProperties">
        hibernate.dialect=org.hibernate.dialect.Oracle9Dialect
        hibernate.default_schema=schemaB
    </property>
    <property name="mappingResources">
        [mapping resources...]
    </property>
</bean>
Run Code Online (Sandbox Code Playgroud)

两个JNDI资源都是javax.sql.ConnectionPoolDatasoure.他们实际上都指向同一个连接池,但我们有两个不同的JNDI资源,因为有两个,完全独立的,表组将移动到在未来不同的数据库的可能性.

然后在代码中,我做:

sessionA = dbASessionFactory.openSession();
sessionB = dbBSessionFactory.openSession();
sessionA.beginTransaction();
sessionB.beginTransaction();
Run Code Online (Sandbox Code Playgroud)

sessionB.beginTransaction()行在这篇文章的标题中产生错误 - 有时候.我在两个不同的sun应用服务器上运行了应用程序.在一个运行它很好,另一个抛出错误.虽然它们连接到不同但等效的数据库,但我认为两台服务器的配置方式没有任何区别.

所以问题是

  1. 为什么上面的代码没有启动完全独立的事务?
  2. 如何强制它启动独立事务而不是分布式事务?
  3. 什么配置可能导致两个应用程序服务器之间的行为差​​异?

谢谢.

PS堆栈跟踪是:

Local …
Run Code Online (Sandbox Code Playgroud)

java hibernate ejb jdbc

4
推荐指数
1
解决办法
1万
查看次数

如何在Java EE应用程序中锁定数据库记录?

我想编写一个Java EE Web应用程序,其中不同的用户使用数据库.用户可以开始编辑记录,然后保存更改或取消编辑.在用户编辑时,应该为其他用户锁定记录.它应该锁定在数据库级别,因为还有其他非Java用户编辑同一个数据库,锁定他们所处理的记录.

我理解一些基本的Java +数据库,但我不擅长锁定这样的多用户事物.在互联网上寻找一些例子,在我看来,像Java EE技术的每个"hello world"示例都引入了至少另一种技术.要访问数据库中的对象,我使用JPA.为了锁定记录,我可能需要交易,这会带来JTA.要使用JTA,我需要JNDI.为了处理所有这些对象,我可能还需要EJB和注入......此时我想知道这是否是解决问题的最简单方法,还是我错过了重要的事情.我不知道所有这些技术是否都是必要的(如果是的话,我使用它们;我只是想在我学习它们之前确定).我只是看到我在网上找到的例子非常慷慨地介绍了它们.

我想要一个简单的Java EE代码示例:

  • 使用JPA;

  • 连接到"persistence.xml"文件中描述的数据库;

  • 有一个MyObject属性的类,idname存储在MYOBJECT表中;

  • 有一个方法(例如从JSP页面调用),数据库级锁定对象id = 42(以便访问同一数据库的非Java用户也无法修改它),或者如果记录已被另一个锁定,则显示错误user(另一个Java用户或非Java用户);

  • 有另一个方法(例如从另一个JSP调用),它可以更新name到指定的值并释放锁,或者只在提供空字符串时释放锁.

对于您在解决方案中引入的每种新技术,我想听一个非常简短的解释为什么使用它.此外,该技术是否需要我安装新库,创建或修改配置文件,编写其他代码等(调用方法的JSP文件不是必需的;我对数据库相关的部分感兴趣.)

(另一个细节:这里描述了EntityTransaction和UserTransaction之间的区别.如果我理解正确,只有在我使用多个数据库时才需要JTA.如果我只使用一个具有不同模式的Oracle数据库,是否还需要它?如果是,那么请使用JTA编写示例代码.)

java jpa transactions java-ee

1
推荐指数
1
解决办法
4612
查看次数

标签 统计

java ×3

java-ee ×2

jpa ×2

ejb ×1

hibernate ×1

jdbc ×1

jta ×1

transactions ×1