不使用EJB时,将数据库事务与Seam一起使用的最佳实践是什么-即。将Seam部署为WAR时?
默认情况下,Seam
JavaBeans支持事务。我可以使用@Transactional注释方法,以确保需要进行事务处理。或者我可以使用@Transactional(NEVER)或@Transactional(MANDATORY)。我不知道怎么做是创建自己的事务,设置超时,开始然后提交/回滚。
我试过使用:
UserTransaction utx = Transaction.instance();
utx.setTransactionTimeout(2000);
utx.begin();
但是,如果事务已在进行中,则将其忽略;如果使用@Transactional(NEVER)注释该方法,则返回javax.transaction.NotSupportedException
任何帮助表示赞赏。谢谢。
如您所知,事务管理是一个跨领域的问题。因此,将代码分散在不是主要关注点的模块中并不是一个好主意。
如果在非EJB环境中使用JTA UserTransaction,则可以使用JTA(Apache Tomcat不支持JTA)。
1°法则
默认情况下 ,所有JSF请求(Seam 2.0+)都 启用 Seam事务管理。
我认为 Seam事务管理 听起来比 Seam管理的 事务
更好。这意味着Seam会在后台谨慎地调用begin和commit。Seam通过使用Seam事务管理器扮演事务管理器的角色
1°场景 :可用POJO + JTA(Apache Tomcat不支持JTA)
Seam使用的事务管理器:org.jboss.seam.transaction.UTtransaction
当JTA可用时,在非EJB环境(战争)中默认启用(JBoss支持JTA)
如果您使用的是JPA EntityManager或Hibernate Session,则需要注册它们以允许Seam管理事务边界
参见9.3。Seam管理的持久性上下文如何设置Seam管理的持久性上下文(使用@In注入)
然后使用@In(作用域为ScopeType.CONVERSATION)注入EntityManager(EntityManager)或Session(hibernate)。
@Name("businessService")
public class BusinessServiceImpl implementes BusinessService {
@In
private EntityManager entityManager;
public void doSomething() {
// You do not need to call entityManager().getTransaction().begin();
// because Seam Transaction Manager takes care of it
// By using proxies
// Therefore, if you call entityManager().getTransaction().begin()
// You will get IllegalStateException
// Some EntityManager operations persist, find etc
// You do not need to call entityManager().getTransaction().commit();
// because Seam Transaction Manager takes care of it
// By using proxies
}
}
在后台,Seam Transaction
Manager通过调用joinTransaction方法在活动的JTA
UserTransaction中注册EntityManager(JPA)或Session(hibernate)
2°场景 :POJO + RESOURCE_LOCAL(hibernate或JPA)事务
Seam(JPA)使用的事务管理器:org.jboss.seam.transaction.EntityTransaction
Seam(Hibernate)使用的事务管理器:org.jboss.seam.transaction.HibernateTransaction
参见9.3。Seam管理的持久性上下文如何设置Seam管理的持久性上下文(使用@In注入)
在后台,Seam Transaction Manager通过使用代理来处理调用begin和commit的底层技术
3°场景 :EJB
Seam使用的事务管理器:org.jboss.seam.transaction.CMTTransaction
在EJB环境中默认启用。请注意,在这种情况下,Seam不控制容器管理的事务。
问候,
我正在使用方法级别的@KafkaHandler(类级别的@KafkaListener)消费Kafka事件。 我见过很多例子,其中有一个“acknowledge”参数可用,在这个参数上可以调用“acknowledge()”方法来提交事件的消耗,但是,当我将它作为参数包含到我的方法中时,我无法填充acknowledge对象。使用KafkaHandler时如何手动提交?有可能吗? 代码示例: 使用Spr
问题内容: 我正在使用Spring / Spring-data-JPA,发现自己需要在单元测试中手动强制提交。我的用例是我正在做一个多线程测试,其中我必须使用在生成线程之前保留的数据。 不幸的是,鉴于测试正在事务中运行,即使不能使它也不能被衍生线程访问。 我尝试使用实体管理器来执行操作,但是在执行此操作时收到错误消息: 有什么方法可以提交事务并继续进行吗?我一直找不到任何允许我调用的方法。 问题答
问题内容: 通常,播放!在请求成功完成后提交事务。在Play中手动提交交易的正确方法是什么? 问题答案: 您可以通过调用JPA.em()获得Hibernate EntityManager。然后,您可以从那里访问事务(JPA.em()。getTransaction())。 如果您打算自己管理事务,则将要禁用Play!的事务处理(可以在方法或控制器上使用@NoTransaction注释来执行此操作)。
我正在使用ReplyingKafkaTemplate.sendAndReception()发送和接收由相关ID关联的消息。用例有许多主题正在进行中,我需要手动acknoledge(提交)消耗的消息偏移量。到目前为止还不错,这是使用: 但我不知道如何手动确认最后一条消息(sendAndReceive()使用的消息)。 有什么提示吗? 谢谢 费尔南多
但是我没能做到这一点,也就是说,我有一个需要多个签名的策略,所以我用这两个组织的MSP信息先后在事务文件(.tx)上签名,但是当我提交事务时,订单者或同行会拒绝它,说“签名集不满足策略...”。 奇怪的是,这个检查忽略了我所做的其他签名,它只会认为签名是由提交事务的命令自动完成的:peer channel update或peer chaincode实例化,就好像最后一个签名使我之前手动应用的签名无