需要在PLSQL中由在不同会话中同时运行的不同SP写入单个日志文件



我想由在不同会话中运行的多个SP写入单个日志文件(每天创建(。

这就是我所做的。

create or replace PKG_LOG:
procedure SP_LOGFILE_OPEN
step 1) Open the logfile:
LF_LOG      := UTL_FILE.FOPEN(LV_FILE_LOC,O_LOGFILE,'A',32760);
end SP_LOGFILE_OPEN;
procedure SP_LOGFILE_write
step 1) Write the logs as per application need:
UTL_FILE.PUT_LINE(LF_LOG,'whatever i want to write');
step 2) Flush the content as i want to logs to be written in real time.
UTL_FILE.FFLUSH(LF_LOG);
end SP_LOGFILE_write;

现在,每当在任何存储过程中,我想首先写入日志时,我都会调用SP_LOGFILE_OPEN,然后调用SP_LOGFILE_write(根据需要多次(。

问题是,如果有两个存储过程,比如SP1和SP2。如果它们都试图同时打开它,它就永远不会通过错误或等待另一个错误完成。相反,它在执行SP1和SP2的两个会话中都是打开的。SP1的内容(如果它首先开始运行(将完全写入日志文件,但SP2的内容将部分写入日志文件。SP2只有在SP1的执行停止时才开始写入。另外,由于FFLUSH,它试图写入日志文件的SP2的初始内容也会丢失。根据我的要求,我不想在SP1运行时丢失第二个SP2的内容。有什么建议吗。我不想放弃FFLUSH的想法,因为我需要实时。谢谢

您可以使用DBMS_LOCK来获得自定义锁,或者等待锁可用,然后进行编写,然后释放锁。它必须被序列化。

但这将使您的并发问题更加严重。您基本上是说,对这个过程的所有调用都必须排成一行,并逐个处理。请记住,磁盘I/O速度很慢,所以您的数据库现在只能和磁盘一样快。

你的主意不好。不直接写入文件,只需将日志消息排入Oracle高级队列,并创建一个频繁运行的作业(每隔几秒钟(,即可从AQ出列。它是由实际写入文件的作业调用的过程。通过这种方式,您可以同步尝试同时登录同一文件的不同SP执行。实际的日志记录是由作业调用的一个SP进行的。

最新更新