有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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

一般情况下

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

具体地说

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) 个答案

  1. # 1 楼答案

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

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

  2. # 2 楼答案

    虽然这可能不是正确的做事方式,但这是如何做到的

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

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

  3. # 3 楼答案

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