记录oracle数据库连接满的解决办法

一、描述

数据库突然连不上,检查:
1、如果全部用户都连不上,有可能是归档日志满了,需要删除归档日志。
2、如果部分用户可以连上,并且很慢,则有可能就是连接数满了。

二、连接数满
分析:
1、有可能是数据库操作一直没释放。
2、项目使用数据库连接池,数据库连接池超时。

三、解决办法

1、可以先停止部分项目的进程。
2、直接杀掉数据库的连接数。
3、增大数据库连接数。

四、数据库连接数操作
1、用sys角色登录数据库(ps命令:sqlplus sys/密码 as sysdba)。
2、查询当前连接数:

select  b.MACHINE, b.PROGRAM , count(*) from v$process a, v$session b where a.ADDR = b.PADDR and  b.USERNAME is not null   group by  b.MACHINE  , b.PROGRAM order by count(*) desc;

如下图:
在这里插入图片描述
可以看到所有连接的机器、程序、连接数量。(我这里有本地电脑,服务器等连接)。

五、杀掉连接数的方法
1、找到最多的连接数机器名:

select 'alter system kill session ''' || sid || ',' ||serial# || ''' immediate;' sql,username,program,machine,status from v$session where machine ='机器名称'

这个语句可以自动拼接杀掉连接数的sql语句,就是第一个sql列:
在这里插入图片描述
可以全部复制出来,然后批量执行就行了。这里杀的连接数都是INACTIVE类型的,被杀掉的状态会不一样。

六、存储过程方法

1、如果想定时清理INACTIVE会话,我们要创建一个存储过程找出超过2小时(可以根据自身项目需求设定)的会话,然后断开会话,具体如下:

CREATE OR REPLACE PROCEDURE DB_KILL_IDLE_CLIENTS AUTHID DEFINER AS
  job_no       number;
  num_of_kills number := 0;
BEGIN
 
  FOR REC IN (SELECT SID, SERIAL#, INST_ID, MODULE, STATUS
                FROM gv$session S
               WHERE S.USERNAME IS NOT NULL
                 AND S.LAST_CALL_ET >= 2 * 60 * 60
                 AND S.STATUS = 'INACTIVE'
               ORDER BY INST_ID ASC) LOOP
    DBMS_OUTPUT.PUT('LOCAL SID ' || rec.sid || '(' || rec.module || ')');
    execute immediate 'alter system disconnect session ''' || rec.sid || ', ' ||
                      rec.serial# || '''immediate';
   
    DBMS_OUTPUT.PUT_LINE('. killed locally ' || job_no);
    num_of_kills := num_of_kills + 1;
  END LOOP;
  DBMS_OUTPUT.PUT_LINE('Number of killed system sessions: ' ||
                       num_of_kills);
END DB_KILL_IDLE_CLIENTS;

2、创建定时任务执行这个存储过程:

begin
  sys.dbms_job.submit(job       => :job,
                      what      => 'SYS.DB_KILL_IDLE_CLIENTS;',
                      next_date => to_date('29-04-2021 17:00:00',
                                           'dd-mm-yyyy hh24:mi:ss'),
                      interval  => 'TRUNC(sysdate,''hh'') + 1/(24)');
  commit;
end;

然后就没有然后了。。。

增加数据库连接数: https://blog.csdn.net/code_ang/article/details/116273312

  • 5
    点赞
  • 48
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
.NET Oracle数据库连接是通过Oracle Data Provider for .NET(ODP.NET)来实现的。ODP.NET是由Oracle公司提供的用于.NET平台的数据库连接组件,它可以与Oracle数据库进行高效的通信和交互。 在使用ODP.NET进行连接之前,需要在项目中添加对ODP.NET的引用。可以通过NuGet包管理器来安装ODP.NET驱动程序。 连接到Oracle数据库需要提供数据库的连接字符串。连接字符串包括数据库的服务器名称、端口号、数据库名称、用户名和密码等信息。可以使用ConnectionStringBuilder类来构建连接字符串。 连接到Oracle数据库的代码示例如下: ```csharp using Oracle.ManagedDataAccess.Client; class Program { static void Main() { string connectionString = "Data Source=server_name;User Id=user_name;Password=password;"; using (OracleConnection connection = new OracleConnection(connectionString)) { try { connection.Open(); Console.WriteLine("Oracle数据库连接成功!"); // 进行数据库操作... } catch (Exception ex) { Console.WriteLine("连接失败:" + ex.Message); } } } } ``` 上述代码中,首先创建了一个OracleConnection对象,并以连接字符串作为参数进行初始化。然后调用Open方法来打开与数据库的连接。如果连接成功,就可以使用该连接对象进行数据库操作。在不需要连接时,使用using语句块来自动释放连接资源。 需要注意的是,如果在连接字符串中使用了用户名和密码,应该确保它们的安全性,避免被恶意获取。 以上就是使用.NET连接Oracle数据库的简单示例。实际应用当中可能还需要处理异常、执行SQL语句、读取和修改数据库记录等操作。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值