Linux 如何在创建新文件时写入DB触发器?

Linux 如何在创建新文件时写入DB触发器?,linux,oracle,plsql,Linux,Oracle,Plsql,我有一个在文件夹中创建和存储日志的应用程序。 我需要识别新的日志,解析它们,并用解析文件的内容更新数据库 如何识别新日志文件并触发触发器?(unix/linux机器上的服务器) 日志的文件名不包含时间戳。而且,我有100多个请求在1分钟内进入文件夹。 文件名由唯一的订单ID和源目标组件组成 日志文件夹的结构按日期排序: X |__2013 |__12 |__31 |__LOG_FROMCOMP_TOCOMP_ORDERID.TXT 我

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

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

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

X
|__2013
      |__12
          |__31
              |__LOG_FROMCOMP_TOCOMP_ORDERID.TXT
我无法更新应用程序来更新数据库,日志文件夹对于许多组件来说都是公用的。我应该解析日志文件夹,然后相应地更新数据库

“我有100多个请求在1小时内落入该文件夹 分钟“

换句话说,您的应用程序设计得很差,应该具有基于消息的体系结构,但在20世纪90年代初仍处于困境。同情

另外,文件名被选择为尽可能没有帮助。同情加倍

更坏的消息是:数据库很难使用这样的目录结构。Oracle安全模型需要已知的OS目录;如果你每天都要创建一个新的目录,那么目录对象就无法维持它,这就排除了使用外部表的可能性(将文件加载到数据库中的最简单方法)

那么,我们能做些什么呢?两种选择

  • 调用PL/SQL的shell脚本
  • 调用PL/SQL的Java存储过程
  • shell脚本编写方法将涉及定期(通过cron或其他方式)启动的守护程序脚本,该脚本计算当前目录并查找自上次轮询以来添加的文件。shell脚本需要将其执行时间存储在配置文件中。这里的问题是unix不存储文件创建时间。但是,如果您可以依赖于只编写一次且从不更新的文件,则可以使用
    ls-c
    对文件进行排序,并根据存储的执行时间对其进行过滤

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

    要从数据库控制所有内容,需要使用Java存储过程读取目录。Tom Kyte有一个填充临时表的解决方案,您可以根据自己的需要对其进行调整。同样,您需要派生实际目录

    在这种方法中,JSP通过DBMS_作业调用,并为每个文件调用PL/SQL程序集;它传递完整的文件路径,存储过程使用UTL_文件读取文件。注意这意味着说服DBA在
    init.ora
    文件中设置UTL\u FILE\u DIR参数。这是不推荐的,所以期待一些阻力。但是,它需要通配符,因此这是处理动态目录名的唯一方法

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



    由于您有一个消息传递体系结构,您有第三个选择:在永久更改的目录中删除单个文件时,使用前进队列。显然,发送一条额外的消息确实需要对应用程序进行一些更改,但我希望更改的幅度最小。AQ肯定比我上面提出的任何一种解决方案都要整洁

    我有适当的MQs和JMS,它们将请求排队并处理它们。仅供参考:在过去1.5年中,我一直保持零请求辍学。我正在尝试实施一种新的日志机制,它可以实现我在问题中提到的功能。谢谢APC。我们已经有了一个file walker代码段来遍历所有文件路径。因为订单ID是递增的,我们知道组件的顺序。我们可以不费吹灰之力就识别出未处理的文件。谢谢你的意见。我会带他们去做的。