使用Java应用程序中的触发器进行数据库轮询

时间:2011-06-26 09:29:29

标签: java database asynchronous polling

有人可以指导我找到正确的方向:

我想在我的Java程序中使用异步函数,在调用它时,它会持续监视数据库中某些表的更改。当发生更改时,它会返回一些事件。但只要应用程序正在运行,它就会继续这样做。

任何帮助都会很棒...... thnx!

1 个答案:

答案 0 :(得分:1)

  • 您可以在函数中使用一个线程来监视某些表中的更改。
  • 在线程编写代码中访问与数据库相关的查询。

    您可以使用Quartz - 一种开源作业调度服务。

    http://www.quartz-scheduler.org/

来源:Trigger example with Java method getting invoked whenever triiger is called

触发示例

此示例创建一个触发器。它遵循“模型2:使用附加存储过程开发模型”中描述的开发模型。有关使用加载和发布模型创建触发器的示例,请参阅“触发器参数示例”。在该示例中,首先创建一个表和一个Java类。然后将类附加到表中。最后,你创建并触发触发器。

SalaryTrigger类包含check_sal_raise方法。如果员工的加薪超过百分之十,则该方法会打印一条消息。触发器在更新EMP表中的工资之前触发该方法。

由于check_sal_raise将消息写入标准输出,因此您应该使用基于DOS的SQL * Plus版本在示例中发出SQL命令。键入以下命令在DOS命令提示符窗口中启动SQL * Plus:

plus80用户名/密码@connect_string

connect_string是ODBC:data_source_name。例如,要以用户SYSTEM身份连接到默认数据库,请在DOS提示符下键入:

plus80 system / pw @ odbc:polite

在SQL * Plus命令行中,按如下所示创建并填充EMP表:

CREATE TABLE EMP(E#int,name char(10),salary real,

约束E#_PK主键(E#));

插入EMP价值观(123,'史密斯',60000);

插入EMP价值观(234,'琼斯',50000);

将以下类放在SalaryTrigger.java中:

 class SalaryTrigger {

      private int eno;

      public SalaryTrigger(int enum) {

      eno = enum;

      }

     public void check_sal_raise(float old_sal,float new_sal)
     {
        if (((new_sal - old_sal)/old_sal) > .10)
        {
           // raise too high  do something here
           System.out.println("Raise too high for employee " + eno);
        }
     }
   }

SalaryTrigger类构造函数接受一个整数,它将其分配给属性eno(员工编号)。为表EMP中的每一行(即每个员工)创建一个SalaryTrigger实例。

check_sal_raise方法是一种非静态方法。要执行,必须由其类的对象调用。每当修改EMP中一行的salary列时,将创建一个与该行对应的SalaryTrigger实例(如果它尚不存在),并将员工编号(E#)作为构造函数的参数。然后触发器调用check_sal_raise方法。

创建Java类后,将其附加到表中,如下所示:

ALTER TABLE EMP ATTACH JAVA SOURCE“SalaryTrigger”IN'。'

WITH CONSTRUCTOR ARGS(E#);

此语句指示Oracle Lite编译当前目录中的Java源文件SalaryTrigger.java,并将生成的类附加到EMP表。该语句还指定,在实例化类时,Oracle Lite应使用构造函数,该构造函数将E#列中的值作为参数。

将类附加到表后,按如下方式创建触发器:

在每个行的EMP更新之前创建TRIGGER CHECK_RAISE

“check_sal_raise”(old.salary,new.salary);

/

此语句创建一个名为check_raise的触发器,它在更新EMP中任何行的salary列之前触发check_sal_raise方法。 Oracle Lite将salary值的旧值和新值作为方法的参数传递。

在该示例中,行级触发器触发行级过程(非静态方法)。行级触发器也可以触发表级过程(静态方法)。但是,因为语句级触发器对整个语句触发一次,而语句可能会影响多行,所以语句级触发器只能触发表级过程。

以下命令更新薪水并触发触发器:

更新EMP SET SALARY = SALARY + 6100 WHERE E#= 123;

这会产生以下输出:

为员工提高过高