2

我正在尝试对呈现为不同数据库错误的问题进行故障排除,例如 ORA-01000:超出最大打开游标或无法创建数据库连接。我已经查看了 PLSQL 以确定游标是否保持打开状态并且即使出现错误也全部关闭。

java应用和后台如下: 原来的应用是一个三层系统:

图形用户界面应用程序。-> 服务器应用程序 -> 11g Oracle 数据库

增强功能是在 Pivotal Cloud Foundry (PCF) 环境中添加 API 服务。所以这个架构是这样的:

关闭功能:GUI 应用程序 -> 服务器应用程序 -> API 服务 -> 数据库。

所有其他功能:GUI 应用程序 -> 服务器应用程序 -> 数据库。

这已投入生产并运行了一周,没有出现上述任何数据库问题。然后添加了另一个增强功能,其中 API 服务与 PCF 中的其他几个服务进行通信,其中 2 与同一个 oracle 数据库进行通信。现在,在大容量期间,我们会收到这些数据库错误。

在我看来,Oracle 数据库无法跟上这些附加服务的请求。但我怎么能证明这一点。我们为服务器配置了 AppD,但没有为数据库配置。是否有可以在 prod 环境中运行的查询。这表明这些 PCF 应用程序导致了问题?还是我应该去其他地方看看?

谢谢,

更新 我查看了遗留应用程序,结果集已关闭。其他 3 个 PCF 应用程序使用 Spring Boot 连接到数据库。据我了解,关闭连接和结果集不必显式关闭。JDBCTemplate 关闭这些连接/结果集。添加的 PLSQL 有一个额外的游标,它在成功和异常时关闭。

更新 我创建了一个查询,按 sessionID 显示总打开游标 这是查询:

select b.sid, b.username, b.osuser, sum(a.value) total_opened_current_cursors
from sys.v_$statname c,  
     sys.v_$sesstat a,
     sys.v_$session b    
 where a.statistic#=c.statistic# and 
      b.sid=a.sid and 
      c.name in ('opened cursors current') and 
      (b.username is not null or b.username <> '' )   
group by b.sid, b.username, b.osuser
order by total_opened_current_cursors desc

现在,我需要将 sessionID 与具有此会话的应用程序链接起来。顶部的osuser为 NULL。此外,大多数会话的状态是INACTIVE 如何识别会话的应用程序?其次,会话是否处于非活动状态,我认为这意味着没有查询发生,那么为什么会有打开的游标?

        **UPDATE**

所以,我写了一个查询,返回打开游标最多的前 10 个会话

select * 
FROM 
(
select b.sid, b.username, b.osuser, b.status, sum(a.value) total_opened_current_cursors
from sys.v_$statname c,  
     sys.v_$sesstat a,
     sys.v_$session b    
 where a.statistic#=c.statistic# and 
      b.sid=a.sid and 
      c.name in ('opened cursors current') and 
      (b.username is not null or b.username <> '' )   
group by b.sid, b.username, b.osuser,  b.status
order by total_opened_current_cursors desc
)
WHERE ROWNUM <= 10;

我找到了占大多数打开游标的 SQL_TEXT ......到目前为止!(87%) 那么,如何找到调用此 SQL 的查询?至少有 5 个服务访问了数据库。一些服务调用 PLSQL 存储过程,一些调用原始 SQL 文本。说明打开游标的查询被列为SELECT语句。这是否意味着它不是存储过程?或者可以在存储过程中调用此SELECT 。
如何找到使用此会话的连接?

4

0 回答 0