ORACLE数据库长连接客户端持久的CLOSE_WAIT

news2024/11/29 14:54:51

前言

根据以往的项目构造,业务层数据库基本使用长连接形式进行批量操作。大部分周期有执行的链接基本正常。再长期的内测中也没有发生CLOSE_WAIT的现象。

上线后采用的数据库使用了新的版本,发现产生CLOSE_WAIY。根据开发经验和网上搜索,发现网上也有相关的开发人员询问ORACLE。但是没有直观答案,全是检查网络的。

也让网络侧的进行了相关查阅配置。根据协议开发经验,我断定是会话层引入了链路保活机制,工作年限十年以内,没有和最初的项目建设人员共事过。不知道以往有没有这个现象。

 验证环境

1. linux服务器

2. oracle 数据-该位DBA设定,我查阅了一边sql.ora 没有什么特殊的配置,应当是默认值

3. PRO*C程序

程序构造

多线程,链路长连接。其中有一个专用线程只有产生数据才会入库。

伪代码

```

void* threadToDBoperator()

{

    int ret=0;

    while(1){

        if(hasdata)

        {

            ret=DataTooperator(DB);

            if(ret==ok)

            {

            }else

            {

                release(DB);

                connect(DB);

            }

        }else{sleep(1);}

    }

}

```

可以发现,一旦长期没有数据,那么程序是不会执行数据库操作,因此包括oracle自身的数据库基础链路保活协议都不会执行的。

虽然TCP层也有链路保活机制,但是TCP的机制在缓冲区满的情况是无法及时到达的,因此应用层的感知需要应用层有探测功能。

通过长期无数据的程序中,根据对各个线程增加线程周期执行时间定点日志,确定oralce的保活机制在确认长期无交互的情况回在服务器端主动掐断链路。因此客户端会出现CLOSE_WAIT。

定位方式

线程在执行数据库时进行时间日志打印,用该时间进行定位。我本来想用session的客户端端口定位的,但是找了半天,没有找到客户端提取客户端端口的办法,只能加调测信息,利用数据库的最高权限进行定位,并提取客户端端口

```sql

-- 根据最近执行接收的SQL时间断定程序线程的执行时间

-- 先查到程序清单

select TO_CHAR( PREV_EXEC_START,'yyyymmddhh24miss'),port,program from v$session;

-- 例如程序是wechat@hhapp

select TO_CHAR( PREV_EXEC_START,'yyyymmddhh24miss'),port,program from v$session where program like 'wechat@hhapp %' ;

date -d @1678188352  '+%Y-%m-%d %T %z'

```

已经通过客户端netstat 检测到接收缓冲区有数据残留在CLOSE_WAIT状态下。

也通过抓包看到TNS包结构。

 

通过sql端口过滤出来的,猜测以下为服务端的链路探测包

 

程序方面如何应对解决

根据这个现象,目前我认为有两种解决方案,

1.直接长连接,变成短连接接。缺点:一旦需要频繁操作,性能耗在链路重连这边。

2.操作数据前进行保活探测,先执行一下无关的命令,命令失败再进行重连。

```

 SELECT TO_CHAR(SYSDATE,'yyyymmddhh24miss') into :CHECK_TIME  FROM DUAL;

```

附录


 

数据库的一些操作参数应当是和项目相关性极强的。程序的架构设计也是和项目特征相关性极强。

数据库TCP层阻塞操作。和数据库内部处理无关的。大部分数据库在tcp层设置的都是阻塞读写操作。

与之比较的mysql是在8.0后的版本后面才引入noblock操作。这种必须和项目的重要性严重捆绑。

与平时设计的流量太多选择丢弃数据还是长期阻塞抉择是类似的。


 

```

https://docs.oracle.com/cd/E11882_01/network.112/e10835/sqlnet.htm#NETRF227

sqlnet.ora

设置连入数据库后必须在多长时间内完成认证(如:输入用户名/密码),超过此时间没有完成的话,数据库会断开此连接,并将客户端的IP地址和ORA-12170: TNS:Connect timeout occurred错误信息记录到sqlnet.log,而且客户端会收到ORA-12547: TNS:lost contact或ORA-12637: Packet receive failed错误信息。这个设置主要是为了防止denial-of-service攻击

在10.2.0.1.0版本中sqlnet.inbound_connect_timeout参数默认为60秒,即如果连接时间超过60秒则提示超时。

而在其他10G版本中这两个参数默认为0,即无限制。

SQLNET.INBOUND_CONNECT_TIMEOUT

CONNECT_TIME

Specify the total elapsed time limit for a session, expressed in minutes.

IDLE_TIME

Specify the permitted periods of continuous inactive time during a session, expressed in minutes. Long-running queries and other operations are not subject to this limit.

检测超时样例 分钟级别 提示服务端 探测终止连接或客户端终端异常需要断开

SQLNET.EXPIRE_TIME=10

SQLNET.RECV_TIMEOUT=3

SQLNET.SEND_TIMEOUT=3

```




 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/523842.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

『手撕 Mybatis 源码』01 - 基本原理与搭建

MyBatis的架构设计 Api接口层:提供API 增加、删除、修改、查询等接口,通过API接口对数据库进行操作 例如下面这些操作 sqlSession.selectOne(statementId, param); mapperProxy.findByCondition(param);数据处理层:解析sql根据调用请求完成…

机器学习模型的评估

(1)数据划分 将可用数据划分为三部分:训练集、验证集和测试集。在训练数据上训练模型。在验证数据上评估模型。模型准备上线之前,在测试数据上最后测试一次 不将数据划分为两部分,即训练集和测试集?在训练…

Java基础(二十三):反射机制

Java基础系列文章 Java基础(一):语言概述 Java基础(二):原码、反码、补码及进制之间的运算 Java基础(三):数据类型与进制 Java基础(四):逻辑运算符和位运算符 Java基础(五):流程控制语句 Java基础(六)&#xff1…

Linux内存管理 (1):内核镜像线性映射的建立

文章目录 1. 前言2. 分析背景3. 内核镜像线性映射的建立过程3.1 预备工作:内核解压缩3.2 建立内核镜像区域的线性映射3.2.1 定位内核入口3.2.2 建立内核线性映射前的其它启动工作3.2.2.1 将 CPU 设为 SVC 模式,且禁用 IRQ FIQ 中断3.2.2.2 获取处理器类…

【C++】实现 priority_queue --- 反函数

priority_queue 实际上是以 堆 的规则组织起来的数组&#xff0c;是一颗完全二叉树 **反函数 !!! 堆的向上向下调整 #pragma oncenamespace xiong {//反函数template<class T>struct less{bool operator()(const T& x, const T& y){return x < y;}};templat…

python列表逆序排列的方法

python中的列表是可以直接进行逆序排列的&#xff0c;但是在 python中&#xff0c;逆序排列也是有一定规则的&#xff0c;一般是按升序排序&#xff0c;也就是从左到右。比如 list[1,2,3,4]&#xff1b; 注意&#xff1a;顺序相同的元素可以放在同一行&#xff1b; 在 python中…

嵌入式电路基础

电路基础 器件基础基本电路术语与符号 信号浮动三态门&#xff08;三态缓冲器&#xff09;上下拉电阻基本元件与逻辑OC/OD门&#xff08;掌握原理&#xff0c;用途&#xff09;开放收集器&#xff08;OC门&#xff0c;NPN型三极管&#xff09;掌握原理、用途漏极开路&#xff0…

C++ STL—vector,map,set,list,deque等

STL是什么 STL是标准模板库&#xff0c;包括算法、容器和迭代器。 算法&#xff1a;包括排序、复制等常用算法容器&#xff1a;数据存放形式&#xff0c;包括序列式容器和关联式容器&#xff0c;序列式容器就是list,vector&#xff0c;关联式容器就是set,map等迭代器是在不暴…

考研复试刷题第八天:日期累加 【日期问题】

本来以为和上次那个简单题一样的&#xff0c;没啥难度&#xff0c;就是循环就完事了&#xff0c;结果超时了 超时代码: #include <iostream> using namespace std;//平年各个月份都多少天&#xff1f; int mouths [13] {0,31,28,31,30,31,30,31,31,30,31,30,31 };//判…

Spring事务深度学习

jdbcTemp Spring 框架对 JDBC 进行封装&#xff0c;使用 JdbcTemplate 方便实现对数据库操作。 JdbcTemp的使用 对应依赖 <!-- MySQL驱动 --><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><ve…

已知相机内外参通过COLMAP进行稀疏/稠密模型重建操作过程

在https://colmap.github.io/faq.html#reconstruct-sparse-dense-model-from-known-camera-poses 中介绍了已知相机内外参如何通过COLMAP进行稀疏和稠密模型重建的过程&#xff0c;这里按照说明操作一遍&#xff1a; 在instant-ngp中&#xff0c;执行scripts/colmap2nerf.py时…

request页面代码逻辑

一. 封装请求基地址 在src目录下面建一个api文件夹 然后在文件夹里面新建一个专门放用户请求的use.js 用axios发送请求 在use.js文件夹里导入request 在src目录新建发送请求的页面并导入封装好的请求 然后把这个请求封装成一个函数&#xff0c;这个函数里需要传入两个参数。 …

Xavier或TX2配置ipv4地址

输入ifconfig查看本地ipv4地址&#xff0c;发现并没有设置&#xff0c;无法通过以太网与其他主机通信。下面来配置系统的以太网地址。 1、编辑文件/etc/network/interfaces: sudo gedit /etc/network/interfaces2、用下面的内容来替换有关eth0的行&#xff0c;并且将ip地址等信…

Java中抽象类和接口的区别,一文弄懂,图文并茂

目录 前言 1. 抽象类 1.1 定义 1.2 示例 1.3 使用 1.3.1代码-抽象类 1.3.2代码-抽象类继承类使用 1.3.3输出结果为&#xff1a; 1.4UML类图展示类间的关系 2. 接口 2.1 定义 2.2 示例 2.2.1代码-接口 2.3 使用 2.3.1代码-接口实现 2.3.2代码-接口实现类使用 2…

【Linux】驱动内核调试,没有几板斧,怎么能行?

目录 前言&#xff1a; 一、基础打印工具 &#xff08;1&#xff09;printk---最常用 ①Log Buffer: ②Console&#xff1a; ③RAM Console&#xff1a; &#xff08;2&#xff09;动态打印 ①动态打印与printk之间的区别联系 ②动态打印常用的例子 ③动态打印转为pri…

C语言实战 - 贪吃蛇(图形界面)

由于本人精力有限&#xff0c;暂时先把素材和代码放上&#xff0c;等以后有空再补教程。 目录 效果预览 准备工作 EasyX图形库 音频素材 代码编写 Transfer.h文件 game.cpp文件 main.c文件 效果预览 先来看一下最终成品效果 贪吃蛇图形界面 准备工作 EasyX图形库 这…

[230513] TPO72 | 2022年托福阅读真题第1/36篇 | 10:45

Invading Algae 目录 Invading Algae 全文 题目 Paragraph 1 P1 段落大意 问题1 Paragraph 2 P2 段落大意 问题2 *问题3* Paragraph 3 P3 段落大意 问题4 Paragraph 4 P4 段落大意 Paragraph 5 P5 段落大意 *问题5* *问题6* 问题7 问题8 问题9…

【计算机组成原理】第二章 运算方法和运算器

系列文章目录 第一章 计算系统概论 第二章 运算方法和运算器 第三章 多层次的存储器 第四章 指令系统 第五章 中央处理器 第六章 总线系统 第七章 外围设备 第八章 输入输出系统 文章目录 系列文章目录第一章 计算系统概论 **第二章 运算方法和运算器** 第三章 多层次的存储器…

C++移动构造函数

一、背景 拷贝构造函数又分为浅拷贝和深拷贝&#xff1a; 浅拷贝&#xff1a;当类中有指针时&#xff0c;直接复制&#xff0c;会使多个指针指向同一块内存&#xff0c;导致重复析构 深拷贝&#xff1a;每次都是重新赋值一份&#xff0c;这种方法内存消耗较大 因此C就提供…

一觉醒来Chat gpt就被淘汰了

目录 什么是Auto GPT&#xff1f; 与其他语言生成模型相比&#xff0c;Auto GPT具有以下优点 Auto GPT的能力 Auto GPT的能力非常强大&#xff0c;它可以应用于各种文本生成场景&#xff0c;包括但不限于以下几个方面 Auto GPT的历史 马斯克说&#xff1a;“ChatGPT 好得吓…