如何确保Oracle会话已关闭?

时间:2018-05-15 13:01:06

标签: java spring angular oracle session

我有一个在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@RepositoryStoredProcedure,我希望我可以保证我会关闭所有会话。 REST请求。由于我使用的是Oracle,我可以使用

SELECT   username FROM v$session 
WHERE    username IS NOT NULL 
ORDER BY username ASC;

但由于这是一个共享数据库的应用程序,我并不是唯一一个使用它的人。当我运行一个程序时,我知道会话是否被中途杀死,所有未提交的数据都将被回滚。我担心与Oracle的开放会话/连接数量。

1 个答案:

答案 0 :(得分:1)

问题是:当客户端死亡时服务器会发生什么? Oracle连接保持活跃状态​​。

Oracle有一个由SQLNET.EXPIRE_TIME配置的探测进程(以分钟为单位)。设置大于0的值(默认值)可确保由于客户端异常终止而无法无限期地保持连接打开。

这可能会对问题有所启发:https://asktom.oracle.com/pls/asktom/f?p=100:11:0::::P11_QUESTION_ID:2233109200346833212

IOException是否会在您的日志上发出警告?如果没有,也许您需要拦截该异常并记录有关客户端断开连接的一些信息!?