我有一个在Spring上调用REST API的Angular项目。在Angular,我在请求API时使用Observable
类来获取Subscribe对象:
this.currentSubs =
this.entity0.post(arg0, arg1, arg2)
.subscribe((res: any) => {
//logic here
}, (err: HttpErrorResponse) => {
//Error logic here
});
我的API需要40s-2min才能返回响应,而我无法修改复杂性或完成此请求所需的时间。我实现了一个取消按钮,在Angular上调用它:
this.currentSubs.unsubscribe();
当我取消使用此代码时,我在服务器上获得此异常:
java.io.IOException: An established connection was aborted by the software in your host machine.
由于我使用的是@RestController
,@Repository
和StoredProcedure
,我希望我可以保证我会关闭所有会话。 REST请求。由于我使用的是Oracle,我可以使用
SELECT username FROM v$session
WHERE username IS NOT NULL
ORDER BY username ASC;
但由于这是一个共享数据库的应用程序,我并不是唯一一个使用它的人。当我运行一个程序时,我知道会话是否被中途杀死,所有未提交的数据都将被回滚。我担心与Oracle的开放会话/连接数量。
答案 0 :(得分:1)
问题是:当客户端死亡时服务器会发生什么? Oracle连接保持活跃状态。
Oracle有一个由SQLNET.EXPIRE_TIME配置的探测进程(以分钟为单位)。设置大于0的值(默认值)可确保由于客户端异常终止而无法无限期地保持连接打开。
这可能会对问题有所启发:https://asktom.oracle.com/pls/asktom/f?p=100:11:0::::P11_QUESTION_ID:2233109200346833212。
IOException是否会在您的日志上发出警告?如果没有,也许您需要拦截该异常并记录有关客户端断开连接的一些信息!?