【问题标题】:Open and close connection in oracle procedure在 oracle 程序中打开和关闭连接
【发布时间】:2015-10-19 08:36:16
【问题描述】:

我有以下过程,我使用 select 语句将数据插入 temp_soap_monitoring 表。我在FONIC_RETAIL 数据库中有soap_monitoring 表,我想从中获取数据并插入到 temp_soap_monitoring 表中。我为此过程每 5 分钟执行一次调度程序工作,以便始终从soap_monitoring@fonic_retail 表中获取最新数据。这个过程的问题是运行这个过程需要太多的成本和查询执行时间。每次它尝试从 db 链接获取数据并将其保存在我的本地数据库中。我记得在 jave、php 和其他编程语言中,当我们尝试从 db 链接获取数据时,我们有方法打开 db 连接,然后一旦插入完成,我们就可以关闭 db 连接。因此性能提高了,并且它也不会对 db 链接施加负载。在这种方法中,我们不必分配数据库链接来获取数据。所以我相信有什么方法可以在我的 oracle 程序中应用这个逻辑。出现问题是因为现在我正在对 db 链接进行硬编码,但现在我还有 3 个 db 链接,我不想通过分配不同的 db 链接来重复相同的过程。

PROCEDURE  "EXT_SOAP_MONITORING" AS

LAST_SM_ID Number := 0;
LAST_CAPT_DATE DATE;

BEGIN

SELECT LAST_TASK_ID INTO LAST_SM_ID FROM CAPTURING where DB_TABLE='TEMP_SOAP_MONITORING';

insert into TEMP_SOAP_MONITORING(ID,REQUEST_XML,RESPONSE_XML,WEB_SERVICE_NAME,WEB_METHOD_NAME,CREATE_DATE,ERROR_CODE,ERROR_MESSAGE)
select ID,REQUEST_XML,RESPONSE_XML,WEB_SERVICE_NAME,WEB_METHOD_NAME,CREATE_DATE,ERROR_CODE,ERROR_MESSAGE from
SOAP_MONITORING@FONIC_RETAIL WHERE WEB_SERVICE_NAME ='RatorWebShopService'  and WEB_METHOD_NAME = 'placeShopOrder' and ID > LAST_SM_ID order by ID desc;

update
CAPTURING set LAST_TASK_ID=
CASE WHEN ((SELECT MAX(ID) from TEMP_SOAP_MONITORING) IS NULL) AND (LAST_TASK_ID  IS NULL)  THEN (SELECT MAX(ID) from SOAP_MONITORING@FONIC_RETAIL)
WHEN (SELECT MAX(ID) from TEMP_SOAP_MONITORING) IS NULL THEN LAST_TASK_ID + 1
ELSE (SELECT MAX(ID) from TEMP_SOAP_MONITORING) END,
CAPTURING_DATE = CURRENT_TIMESTAMP, LAST_CAPTURED_DATE = LAST_CAPT_DATE where DB_TABLE='TEMP_SOAP_MONITORING';

END EXT_SOAP_MONITORING;

【问题讨论】:

  • 为什么不写触发器?或者物化视图也是一种选择。
  • 有没有办法在触发器中打开和关闭数据库连接?如果我使用触发器或过程,我认为逻辑将保持不变?
  • 另外你知道程序的哪一部分是最高消费者吗?那里最重要的活动是什么?
  • 我没听懂你的问题。
  • 您有机会了解 AWR 吗?

标签: oracle stored-procedures plsql transactions dblink


【解决方案1】:
ALTER SESSION CLOSE DATABASE LINK <user_supplied>; 

Reference

【讨论】:

  • 我已经看到了您提供的参考资料,但我真的不知道如何在我的过程中使用alter session 为数据库链接应用此逻辑。如果您能举出与我的程序相关的小例子,那将非常有帮助。所以在这种情况下,我不需要在我的选择查询中硬核和分配数据库链接?
  • 我没有检查,请在最后一行添加到您的程序中。
  • 好的,但这是为了关闭数据库链接,但我如何打开数据库链接,在这种情况下,我是否需要在我的选择查询中硬核并分配 db 链接?
  • @Rahul:如果您访问 DBLink,Oracle 将自动打开连接
  • 总线正如我所提到的,我有很多程序,我不能在每个程序结束时使用 ALTER SESSION CLOSE DATABASE LINK 因为它会给我一个错误,即 DB 链接正在使用中。
猜你喜欢
  • 2012-09-19
  • 1970-01-01
  • 1970-01-01
  • 2011-08-28
  • 1970-01-01
  • 1970-01-01
  • 2018-10-30
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多