Java 如何确保Oracle会话已关闭?
我有一个Angular项目,它在Spring上调用RESTAPI。在Angular,当请求API时,我使用一个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
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可能会有所帮助。