Oracle调用Java程序-实现数据新增通知-数据库触发式程序操作
前言:
因为公司奇葩的现状,要做个临时用的程序,以应此时项目未上线之需。
流程:
oracle自带了JDK1.4,可在oracle的java source中直接写java代码,实现一些简单的功能,以数据库数据新增触发器->在数据新增时触发操作->调用存储过程或函数->函数调用java程序->java程序通知java服务端进行业务处理。
好处:
因为是触发式操作,具有实时性。
实现:
1.新建socket服务端
代码如下
package com.fntx.sync.server;
import com.fntx.sync.client.Client;
import com.fntx.sync.service.SyncService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.annotation.Async;
import org.springframework.stereotype.Component;
import javax.annotation.PostConstruct;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.ServerSocket;
import java.net.Socket;
/**
* @author HASEE
*/
@Component
public class SyncServer {
// @Autowired
// private SyncService syncService;
private ServerSocket serverSocket;
@Async
public void run() {
try {
serverSocket = new ServerSocket(60000);
} catch (IOException e) {
e.printStackTrace();
}
while (true) {
try {
Socket socket = serverSocket.accept();
BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
String linestr;
while ((linestr = br.readLine()) != null) {
//接收到id
System.out.println("接收到新增数据的id为:"+linestr);
}
} catch (IOException e) {
System.out.println("断开连接");
}
}
}
@PostConstruct
@Async
public void start() {
Thread thread = new Thread(() -> {
try {
System.out.println("同步服务已经启动");
new SyncServer().run();
System.out.println("执行中了");
} catch (Exception e) {
e.printStackTrace();
}
});
//启动线程
thread.start();
}
}
简简单单,是不是,此服务端用来接收新增记录的id
2.pl/sql 连接到oracle数据库
2.1.在java source 这里新建一个java进程
2.2这里做一个socket客户端,将新增记录的id发送给服务端
create or replace and compile java source named clientinsert as
import java.io.PrintWriter;
import java.net.Socket;
public class ClientInsert {
public static String send(String id) {
try{
Socket socket = new Socket("localhost", 60000);
PrintWriter pw = new PrintWriter(socket.getOutputStream(), true);
pw.println(id+",insert");
}catch(Exception e){
e.printStackTrace();
return "defeat";
}
return "ok";
}
}
也是简简单单,完成。
2.3创建存储过程
新建一个存储过程,用来调用java进程
2.4 创建触发器
create or replace trigger order_insert
after insert on HT_ORDER
for each row
begin
insertSocket(:new.ORDER_ID);
end;
至此全流程就结束了。
我也是剑走偏锋才想出的这个实现方案,希望能帮到同样有奇葩需求的你。
有问题请留言,我会定期查看账号。
版权声明:本文为huqingkang111原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
THE END