gpt4 book ai didi

linux - 创建新文件时如何编写数据库触发器?

转载 作者:太空宇宙 更新时间:2023-11-04 11:16:21 25 4
gpt4 key购买 nike

我有一个应用程序可以在文件夹中创建和存储日志。我需要识别新日志、解析它们并使用已解析文件的内容更新数据库。

如何识别新的日志文件并触发触发器? (unix/linux 机器上的服务器)日志的文件名不包含时间戳。而且,我在 1 分钟内有 100 多个请求落入文件夹。文件名由唯一的订单 ID 和源-目的地组成。

日志文件夹的结构按日期排序:

X
|__2013
|__12
|__31
|__LOG_FROMCOMP_TOCOMP_ORDERID.TXT

我无法通过更新应用程序来更新数据库,并且日志文件夹对许多组件都是通用的。我应该解析日志文件夹,然后相应地更新数据库。

最佳答案

" I have more than 100 requests falling into the folder within 1 minute"

换句话说,您有一个设计糟糕的应用程序,它应该具有基于消息的架构,但仍然陷入 1990 年代初期的泥潭。同情。

此外,文件名已被选择为尽可能无用。同情加倍。

更多坏消息:数据库很难在这样的目录结构下运行。 Oracle 安全模型需要已知的操作系统目录;如果您每天都创建一个新目录,而目录对象不支持这种目录对象,那么就排除了使用外部表(将文件加载到我们的数据库中的最简单方法)的可能性。

那么,可以做什么呢?两种选择

  1. 调用 PL/SQL 的 shell 脚本
  2. 调用 PL/SQL 的 Java 存储过程

shell 脚本方法将涉及一个定期触发的守护进程脚本(通过 cron 或其他),它计算出当前目录并查找自上次轮询以来添加的文件。 shell 脚本需要将其执行时间存储在配置文件中。这里的问题是 unix 不存储文件创建时间。但是,如果您可以依赖只写入一次且永不更新的文件,则可以使用 ls -c 对文件进行排序并按存储的执行时间过滤它们。

对于每个文件,shell 脚本调用一个 PL/SQL 过程。它将文件的内容作为 CLOB 传递。存储过程根据需要处理文件。

要从数据库控制这一切,您需要使用 Java 存储过程来读取目录。 Tom Kyte 有一个填充临时表的解决方案,您可以根据需要进行调整。 Find it here .同样,您需要导出实际目录。

在这种方法中,JSP 通过 DBMS_JOB 调用,并为每个文件调用 PL/SQL 程序;它传递完整的文件路径,存储过程使用 UTL_FILE 读取文件。请注意,这意味着说服您的 DBA 在 init.ora 文件中设置 UTL_FILE_DIR 参数。这已被弃用,因此预计会有一些阻力。但是,它需要通配符,因此这是处理动态目录名称的唯一方法。 Find out more .

JSP 将列出临时表中的所有文件。这里的一种解决方案是拥有一个包含所有已处理文件名称的永久表,并使用 MINUS 运算符提取未处理文件集。这比在 shell 脚本方法中依赖 unix ctime 更可靠。


由于您确实拥有适当的消息传递架构,因此您有第三种选择:使用高级队列代替将单个文件放入不断变化的目录中。显然,发送一条额外的消息确实需要对应用程序进行一些更改,但我希望是最小的更改。 AQ 肯定比我上面提出的任何一种解决方案都要简洁。 Find out more .

关于linux - 创建新文件时如何编写数据库触发器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20782684/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com