oracle 中创建 socket客户端 监听数据库变动,返回数据给服务端!!!

embedded/2025/3/16 13:24:20/

目录

      • socket客户端Java代码+ 函数+触发器
      • 1、触发器
      • 2、 函数
      • 3、 java 代码
      • 1、socket ========================
          • 5-1 socket 服务端

socket客户端Java代码+ 函数+触发器

(当数据库数据变动是触发socket客户端代码,将信息发送到服务端)

应用场景 ---- 第三方往中间库导入数据,我需要将中间库的新数据进行定位操作。

1、触发器

在这里插入图片描述

 create or replace TRIGGER TRIGGER1 
AFTER INSERT OR UPDATE OF ID,NAME ON TEST 
for each row
declarereval varchar2(256);returnId varchar2(256);
BEGINdbms_output.put_line('触发器开始执行');
IF inserting THEN SELECT SENDDATA(:new.id) into returnId FROM DUAL; -- 调用socket函数insert into TM_QFI_DATA_TABLE(id,name) values(:new.id,'添加数据触发');ELSIF updating THENSELECT SENDDATA(:new.id)  into returnId FROM DUAL;-- 调用socket函数
insert into TM_QFI_DATA_TABLE(id,name) values(:new.id,'修改数据触发');END IF;dbms_output.put_line(returnId+“触发器调用结束”);
END;

2、 函数

在这里插入图片描述

CREATE OR REPLACE FUNCTION SENDDATA(dataid varchar2) 
RETURN VARCHAR2 AS 
language java 
name 'Client2.send(java.lang.String) return java.lang.String ';

3、 java 代码

在这里插入图片描述

import java.io.IOException;  
import java.net.InetSocketAddress;  
import java.nio.ByteBuffer;  
import java.nio.channels.SocketChannel;  public class Client2 {  //需要一个Selector   public static void send(String dataid) {  //创建连接的地址  InetSocketAddress address = new InetSocketAddress("127.0.0.1", 8765);  //声明连接通道  SocketChannel sc = null;  //建立缓冲区  ByteBuffer buf = ByteBuffer.allocate(1024);  try {  //打开通道  sc = SocketChannel.open();  //进行连接  sc.connect(address);  //定义一个字节数组,然后使用系统录入功能:  byte[] bytes = dataid.getBytes("UTF-8");//把数据放到缓冲区中  buf.put(bytes);  //对缓冲区进行复位  buf.flip();  //写出数据  sc.write(buf);  //清空缓冲区数据  buf.clear();  } catch (IOException e) {  e.printStackTrace();  } finally {  if(sc != null){  try {  sc.close();  } catch (IOException e) {  e.printStackTrace();  }  }  }  }  
}   

1、socket ========================

5-1 socket 服务端

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;public class ServeltSocketTest {public static void main(String[] args) throws IOException {//初始化服务端socket并且绑定9999端口ServerSocket serverSocket = new ServerSocket(8765);//创建一个线程池ExecutorService executorService = Executors.newFixedThreadPool(100);while (true) {//等待客户端的连接Socket socket = serverSocket.accept();Runnable runnable = () -> {BufferedReader bufferedReader = null;try {bufferedReader = new BufferedReader(new InputStreamReader(socket.getInputStream(), "UTF-8"));//读取一行数据String str;//通过while循环不断读取信息,while ((str = bufferedReader.readLine()) != null) {//输出打印System.out.println("客户端说:" + str);}} catch (IOException e) {e.printStackTrace();}};executorService.submit(runnable);}}}

http://www.ppmy.cn/embedded/173071.html

相关文章

整数分段c++

题目描述 小 Z 有一个大整数 s,整数 s 的位数最大可能有 100 位。现在小 Z 将要将这个整数 s 分成若干段,至少两段。 问是否存在一种分段方法,可以使得分段后的每一段整数的各个数位之和相同。 「注意」 本题中的大整数 s 比较特殊&#…

蓝桥杯省赛真题C++B组-2024好数

一、题目 问题描述 一个整数如果按从低位到高位的顺序,奇数位 (个位、百位、万位 ⋯⋯ ) 上的数字是奇数,偶数位 (十位、千位、十万位 ⋯⋯ ) 上的数字是偶数,我们就称之为 “好数”。 给定一个正整数 N,请计算从 1 到 N 一共有多…

PyTorch分布式训练

本文结构: 分布式训练概述环境设置数据并行(DDP)模型并行启动训练性能优化建议示例代码参考资料和相关问题 以下是为您整理的PyTorch分布式训练教程指南: 一、PyTorch分布式训练核心概念 数据并行:通过分割数据集实…

以太坊生态中有代币标准和协议,针对不同场景设计了丰富的功能

一、同质化代币(Fungible Tokens) 1. ERC-20(基础标准) 用途:同质化代币(如 USDT、UNI)。 特点:标准化转账和授权接口。 2. ERC-777(增强版 ERC-20) 改进…

华为重拳出击!华为重拳出击!华为重拳出击!

大家好,我是小程程。 华为出了一个大瓜哦! 华为多名产品线负责人被开除 据财新网 3 月 10 日报道,华为最近发了一则内部通报: 华为称,经审计发现,(ICT 产品与解决方案,半导体业务部、…

【数据挖掘】通过心脏病数据案例熟悉数据挖掘的完整过程

心脏病数据挖掘过程 一、加载数据源 # 如果没有安装数据源所依赖的库,则先安装数据源所在的python库: pip install ucimlrepo # 引入pandas和ucimlrepo import pandas as pd from ucimlrepo import fetch_ucirepo# fetch dataset Heart Disease dataset的Id为45 h…

K8S之QoS详解

Pod QoS 类 服务质量(Quality of Service,QoS)类, 阐述 Kubernetes 如何根据为 Pod 中的容器指定的资源约束为每个 Pod 设置 QoS 类。Kubernetes 依赖这种分类来决定当 Node 上没有足够可用资源时要驱逐哪些 Pod。 QoS 类&#…

《鸿蒙系统下AI模型训练加速:时间成本的深度剖析与优化策略》

在当今数字化浪潮中,鸿蒙系统凭借其独特的分布式架构与强大的生态潜力,为人工智能的发展注入了新的活力。随着AI应用在鸿蒙系统上的日益普及,如何有效降低模型训练的时间成本,成为了开发者与研究者们亟待攻克的关键课题。这不仅关…