【问题标题】:Can a transaction have many threads?一个事务可以有多个线程吗?
【发布时间】:2009-12-04 19:10:58
【问题描述】:

一般情况

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

具体

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>"

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

【问题讨论】:

  • 你能把你的交易分解成子交易吗?
  • 连接是如何产生的?连接只能在单个线程中使用。
  • @Liz 我是一般事务的新手,所以也许你可以添加一些关于子事务如何适应这个的信息的答案(每个线程?这如何影响滚动和发生之前?)@Kathy 我不确定你所说的连接是什么意思,但是 ejb 是填充网页的请求的一部分,并且 postgres 调用使用 PreparedStatement

标签: java multithreading postgresql transactions


【解决方案1】:

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

【讨论】:

【解决方案2】:

在 JDBC 上下文中,我想说的是,如果您能够共享已完成“BEGIN TRANSACTION”的连接并从那里发出所有调用,那么是的,至少理论上应该工作。

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

【讨论】:

    【解决方案3】:

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

    使实现 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
    

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

    【讨论】:

      猜你喜欢
      • 2017-09-17
      • 2014-11-11
      • 1970-01-01
      • 1970-01-01
      • 2011-09-01
      • 1970-01-01
      • 2011-03-09
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多