有人可以指导我找到正确的方向:
我想在我的Java程序中使用异步函数,在调用它时,它会持续监视数据库中某些表的更改。当发生更改时,它会返回一些事件。但只要应用程序正在运行,它就会继续这样做。
任何帮助都会很棒...... thnx!
答案 0 :(得分:1)
在线程编写代码中访问与数据库相关的查询。
您可以使用Quartz - 一种开源作业调度服务。
来源: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;
这会产生以下输出:
为员工提高过高