事务可以有多个线程吗?

时间:2009-12-04 19:10:59

标签: java multithreading postgresql transactions

一般

我们有一些业务逻辑导致交易中的瓶颈。业务逻辑在数据库中查询一组数据(只读),处理它并返回一个对象。必须在给定请求中使用不同的参数多次执行此操作。 我们理论上可以将每个业务逻辑调用分解为一个单独的线程吗?

具体地

EJB object (part of an http request on a JBoss App Server)
-creates objects that implement Callable (call method calls business logic method)
-using an ExecutorService invoke each callable object

Business Logic
-Makes a query of postgresql database which uses a PreparedStatement
-Using POJOs we build objects from ResultSet objects that come from postgresql
-Do expensive calculations

在所有这些之后我们得到postgres错误,即使我们将线程限制为一个,未命名的门户也不存在:

ERROR:  cursor "<unnamed portal 777>" does not exist
STATEMENT:  FETCH ALL IN "<unnamed portal 777>"

我不太确定导致错误的原因是什么,但正确调用了业务逻辑,并且无需线程就可以正常工作。这让我质疑线程是否可以启动并添加到事务中(如果它们可以如何做到这一点?)。

3 个答案:

答案 0 :(得分:3)

您不应该在EJB(或App服务器中的任何其他位置)内创建线程。如果需要将其分解,使用JMS甚至更简单,请使用WorkManager在基于EJB的操作中提供并发性。

答案 1 :(得分:0)

在JDBC上下文中,我会说,如果你能够共享你已经完成“BEGIN TRANSACTION”的连接,并从那里发出你的所有电话,那么是的,它至少应该在理论上工作

我通常不是存储过程的粉丝,但你考虑过那些吗?如果事务中的线程是可能的,那么我希望它在数据库引擎中的表现要比分散在边界内更加明智。

答案 2 :(得分:0)

虽然这可能不是正确的做事的方式,但这是如何解决这个问题。

使实现Callable的对象不仅调用业务逻辑,而且执行EJB查找并调用该方法。结果如下:

EJB object (part of an http request on a JBoss App Server)
-creates objects that implement Callable (call method calls business logic method)
-using an ExecutorService invoke each callable object

Callable Object
-lookup another EJB instance of the class we are already in to get a transaction going
-call that instance's business logic

Business Logic
-Makes a query of postgresql database which uses a PreparedStatement
-Using POJOs we build objects from ResultSet objects that come from postgresql
-Do expensive calculations

我不太喜欢它,这就是为什么我没有选择它作为最好的答案,但在我们的具体情况下它起作用,我认为它会帮助其他人。