检测 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,这里不太可能在事务期间进程死掉或在某处失去连接。
我用的服务器是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,这里不太可能在事务期间进程死掉或在某处失去连接。