检测 EJB 数据源客户端断开连接

Detecting EJB Datasource client disconnect

我用的服务器是GlassFish,但是在Weblogic上也出现这个问题

我的客户机开始一个事务,从服务器查找几个 EJB,然后开始一些需要一段时间才能完成的工作。在此过程中,客户端机器死机(比方说断电)。

客户端机器打开的数据库查询永远不会关闭(因为客户端终止),这会导致死锁和其他问题。

有什么方法可以检测这个死事务并回收所有资源吗?

下面的伪代码示例

transaction.begin();

MyBean bean = (MyBean)ctx.lookup("MyBean");

bean.doComplicatedWorkPart1();

bean.writeResultsToTheDatabase();

// Client dies during this method (powercut), so the transaction
// is simply left hanging.
bean.doComplicatedWorkPart2();

bean.writeResultsToTheDatabase();

transaction.commit();

IIRC 这不容易处理。这取决于您使用的数据库,您需要使用数据库管理来查找挂起的事务。

为了拥有一个更可靠的环境,您应该为此创建一个服务器端 bean,这里不太可能在事务期间进程死掉或在某处失去连接。