Java 一个事务可以有多个线程吗?

Java 一个事务可以有多个线程吗?,java,multithreading,postgresql,transactions,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 dat

一般情况下

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
我们有一些业务逻辑导致了交易中的瓶颈。业务逻辑查询数据库中的一组数据(只读),对其进行处理并返回一个对象。在给定的请求中,必须使用不同的参数多次执行此操作。从理论上讲,我们是否可以将每个业务逻辑调用分离到一个单独的线程中

具体地说

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>"
错误:光标“”不存在
语句:获取全部输入“”

我不太确定是什么原因导致了错误,但是业务逻辑被正确调用,并且在没有线程的情况下工作良好。这让我怀疑线程是否可以启动并添加到事务中(如果可以,我们该怎么做?)

在JDBC上下文中,我想说,如果您能够共享执行“开始事务”的连接,并从那里发出所有调用,那么是的,它至少在理论上可以工作


我通常不喜欢存储过程,但您考虑过这些吗?如果可以在事务中执行线程,我希望它在数据库引擎中的行为比分散在边界上的行为更合理。

您不应该在EJB中创建线程(或者在应用服务器中的任何其他地方)。如果需要将其分解,请使用JMS或更简单的方法,在基于EJB的操作中使用来提供并发性。

尽管这可能不是正确的方法,但这是如何实现的

使实现可调用的对象不只是调用业务逻辑,而是执行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

我不太喜欢它,这就是为什么我没有选择它作为最佳答案的原因,但在我们的具体案例中,它是有效的,我认为它会帮助其他人。

您可以将您的事务分解为子事务吗?如何生成连接?连接只能在单个线程中使用。@Liz我一般不熟悉事务,因此您可以添加一个答案,其中包含一些关于子事务如何适合此线程的信息(每个线程一个?这对滚动有何影响?之前发生过什么?@Kathy我不确定您所说的连接是什么意思,但是ejb是填充网页请求的一部分,postgres调用使用PreparedStatementThank Robin,这是一个方便的页面,将来为thos提供的是:不幸的是,如果是资源管理,Jboss看起来不支持外部的WorkManager接口:(@Adam-你可以试试这个-