【发布时间】:2016-04-13 01:59:58
【问题描述】:
是否可以使用 Hibernate 异步调用存储过程?使用的连接应该在触发存储过程后释放,同时查询继续在 PostgreSQL 的后台运行。然后,存储过程应该将结果写入专用表中,我们以后可以从中收集它。主要目的是防止c3p0连接池的连接耗尽。
【问题讨论】:
标签: java hibernate hibernate-4.x
是否可以使用 Hibernate 异步调用存储过程?使用的连接应该在触发存储过程后释放,同时查询继续在 PostgreSQL 的后台运行。然后,存储过程应该将结果写入专用表中,我们以后可以从中收集它。主要目的是防止c3p0连接池的连接耗尽。
【问题讨论】:
标签: java hibernate hibernate-4.x
我不确定您是否可以使用 Hibernate 做到这一点。如果您调用该过程,程序中的流控制将暂停,直到完成。但是,您可以尝试使存储过程异步。这样,当您使用 hibernate 进行调用时,它将要求数据库启动异步作业,并且您的连接将立即释放。您还必须进行一些查询才能知道您的存储过程是否已完成。
【讨论】:
JDBC 不支持异步执行,因此 Hibernate 也不提供这样的功能。如果你想直接从一个长时间运行的存储过程调用中返回,你想在一个单独的线程中进行这个调用,甚至可以使用ThreadPoolExecutor。这将使您继续处理最初触发调用的线程。在这种情况下,您很可能还可以在执行线程中处理存储过程的结果,而不是写入临时表然后从那里读取。但是,这将取决于您的用例。
但是,您将需要一个连接,因此它不会帮助您用完池中的连接。这是一个实际的问题吗?您是否正确配置了 c3po 池以及底层数据库?
【讨论】: