【发布时间】: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