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
< <上一篇
下一篇>>