Java 如何确保Oracle会话已关闭?

Java 如何确保Oracle会话已关闭?,java,spring,angular,oracle,session,Java,Spring,Angular,Oracle,Session,我有一个Angular项目,它在Spring上调用RESTAPI。在Angular,当请求API时,我使用一个Observable类来获取订阅对象: this.currentSubs = this.entity0.post(arg0, arg1, arg2) .subscribe((res: any) => { //logic here }, (err: HttpErrorResponse) => { //Error logic he

我有一个Angular项目,它在Spring上调用RESTAPI。在Angular,当请求API时,我使用一个
Observable
类来获取订阅对象:

 this.currentSubs =
  this.entity0.post(arg0, arg1, arg2)
    .subscribe((res: any) => {
      //logic here  
    }, (err: HttpErrorResponse) => {
      //Error logic here
    });
我的API需要40s-2min才能返回响应,我无法修改复杂性或完成此请求所需的时间。我实现了一个cancel按钮,在Angular时调用它:

this.currentSubs.unsubscribe();
当我取消使用此代码时,我在服务器上得到此异常:

java.io.IOException: An established connection was aborted by the software in your host machine.
由于我使用的是Spring的
@RestController
@Repository
StoredProcedure
,因此我想知道如何确保关闭有关该REST请求的所有会话。因为我使用的是Oracle,所以我可以使用

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

但由于这是一个具有共享数据库的应用程序,我不是唯一一个使用它的人。当我运行一个过程时,我知道如果会话中途终止,所有未提交的数据都将回滚。我关心的是与Oracle打开的会话/连接的数量。

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

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

也许这可以让我们对这个问题有所了解


IOException是您日志上的警告吗?如果没有,您可能需要拦截该异常并记录一些有关客户端断开连接的信息

IOException由SpringHTTP类捕获/打印。我发现Spring没有创建新的连接,它继续使用相同的会话。由于错误处理程序内置于Spring类中,我认为您的解决方案在这里是不必要的,但在没有使用Spring这样的高级框架的情况下,它是最终必要的。我不确定,但@ControllerAdvice可能会有所帮助。