概述
系统A---->系统B。系统A表数据有新增、修改、删除时,会把这些发生记录的数据同步至系统B。
实现思想:(一)、首先怎么确定系统A需要同步的表中数据发生了变化。
(二)、什么时候需要同步这些有变化的数据。
(三)、咋实现?
第一步:使用SQL中的触发器记录数据变化
触发器的作用是针对需要同步的表进行一个监控作用,当表数据发生了变化,触发器会立马检测到,进行数据记录,此时,我这里使用一个中间临时表进行记录。
实现触发器的SQL:创建一个触发器名称为BIUDFER_YWCL_CASE_220905,需要针对哪张表进行检测———CCS_CASE_BASE_T。监控这张表的动作是update、insert、delete。
数字1表示新增,2表示修改,3表示删除。主要是根据针对监控的表的主键进行记录,此表的主键是caseid。
CREATE OR REPLACE TRIGGER BIUDFER_YWCL_CASE_220905
after update or insert or delete on CCS_CASE_BASE_T
FOR EACH ROW
declare
v_num number;
BEGIN
CASE
WHEN inserting
THEN
insert into EXCH_TRIGGER values(:new.caseid ,'1','CCS_CASE_BASE_T',to_char(list_id.nextval));
WHEN UPDATING
THEN
select count(1) into v_num from EXCH_TRIGGER where INFO_CTRLID=:new.caseid and LIST_TABLE='CCS_CASE_BASE_T' and INFO_CTRLSTATE in('1','2');
if v_num=0 then
insert into EXCH_TRIGGER values(:new.caseid ,'2','CCS_CASE_BASE_T',to_char(list_id.nextval));
end if;
WHEN DELETING THEN
select count(1) into v_num from EXCH_TRIGGER where INFO_CTRLID=:old.caseid and LIST_TABLE='CCS_CASE_BASE_T' and INFO_CTRLSTATE in('1');
if v_num=1 then
delete from EXCH_TRIGGER where INFO_CTRLID=:old.caseid and LIST_TABLE='CCS_CASE_BASE_T' and INFO_CTRLSTATE in('1');
else
select count(1) into v_num from EXCH_TRIGGER where INFO_CTRLID=:old.caseid and LIST_TABLE='CCS_CASE_BASE_T' and INFO_CTRLSTATE in('2');
if v_num=1 then
delete from EXCH_TRIGGER where INFO_CTRLID=:old.caseid and LIST_TABLE='CCS_CASE_BASE_T' and INFO_CTRLSTATE in('2');
insert into EXCH_TRIGGER values(:old.caseid ,'3','CCS_CASE_BASE_T',to_char(list_id.nextval));
else
insert into EXCH_TRIGGER values(:old.caseid ,'3','CCS_CASE_BASE_T',to_char(list_id.nextval));
end if;
end if;
END CASE;
END;
临时表EXCH_TRIGGER,建表语句
CREATE TABLE "EXCH_TRIGGER"
(
"INFO_CTRLID" VARCHAR2(40),
"INFO_CTRLSTATE" VARCHAR2(1),
"LIST_TABLE" VARCHAR2(200),
"LIST_ID" VARCHAR2(18) NOT NULL,
NOT CLUSTER PRIMARY KEY("LIST_ID")) STORAGE(ON "MAIN", CLUSTERBTR) ;
COMMENT ON TABLE "EXCH_TRIGGER" IS '导库控制表';
COMMENT ON COLUMN "EXCH_TRIGGER"."INFO_CTRLSTATE" IS '操作数据库状态:1=insert,2=update,3=delete';
COMMENT ON COLUMN "EXCH_TRIGGER"."LIST_TABLE" IS '操作表';
临时表的序列,自增id。
CREATE SEQUENCE "LIST_ID" INCREMENT BY 1 START WITH 1 MAXVALUE 999999999 MINVALUE 1 CACHE 20;
第二步、Java程序实现
代码中要随时知道表中有记录生成,就需要用到定时任务。所以就是编写定时任务。
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:dwr="http://www.directwebremoting.org/schema/spring-dwr"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.0.xsd
http://www.directwebremoting.org/schema/spring-dwr
http://www.directwebremoting.org/schema/spring-dwr-3.0.xsd">
<bean id="quartz" lazy-init='false' class="org.springframework.scheduling.quartz.SchedulerFactoryBean"></bean>
<!-- 用于定时同步数据 -->
<bean id="MyDzfwQuartz" class="com.zrar.main.quartz.MyDzfwQuartz"></bean>
<!-- 定义调用对象和调用对象的方法 -->
<bean id="MyDzfwTask" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
<!-- 调用的类 -->
<property name="targetObject">
<ref bean="MyDzfwQuartz"/>
</property>
<!-- 调用类中的方法 -->
<property name="targetMethod" value="dataChange">
</property>
</bean>
<bean id="MyDzfwTrigger" class="org.springframework.scheduling.quartz.CronTriggerFactoryBean">
<property name="jobDetail" ref="MyDzfwTask" />
<!-- 每1分钟执行一次 -->
<property name="cronExpression" value="0 * * * * ?" />
</bean>
<!-- 用于定时同步数据 -->
<bean id="HljToGxbZskQuartz" class="com.zrar.main.quartz.HljToGxbZskQuartz"></bean>
<!-- 定义调用对象和调用对象的方法 -->
<bean id="HljToGxbZskDataChangeTask" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
<!-- 调用的类 -->
<property name="targetObject">
<ref bean="HljToGxbZskQuartz"/>
</property>
<!-- 调用类中的方法 -->
<property name="targetMethod" value="dataChange">
</property>
</bean>
<bean id="HljToGxbZskDataChangeTrigger" class="org.springframework.scheduling.quartz.CronTriggerFactoryBean">
<property name="jobDetail" ref="HljToGxbZskDataChangeTask" />
<!-- 每1分钟执行一次 -->
<property name="cronExpression" value="0 * * * * ?" />
</bean>
<!-- 用于定时同步数据 -->
<bean id="HljToGxbQuartz" class="com.zrar.main.quartz.HljToGxbQuartz"></bean>
<!-- 定义调用对象和调用对象的方法 -->
<bean id="HljToGxbDataChangeTask" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
<!-- 调用的类 -->
<property name="targetObject">
<ref bean="HljToGxbQuartz"/>
</property>
<!-- 调用类中的方法 -->
<property name="targetMethod" value="dataChange">
</property>
</bean>
<bean id="HljToGxbDataChangeTrigger" class="org.springframework.scheduling.quartz.CronTriggerFactoryBean">
<property name="jobDetail" ref="HljToGxbDataChangeTask" />
<!-- 每1分钟执行一次 -->
<property name="cronExpression" value="0 * * * * ?" />
</bean>
<!-- 用于定时同步数据 -->
<bean id="HljToGxbYYQuartz" class="com.zrar.main.quartz.HljToGxbYYQuartz"></bean>
<!-- 定义调用对象和调用对象的方法 -->
<bean id="HljToGxbYYDataChangeTask" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
<!-- 调用的类 -->
<property name="targetObject">
<ref bean="HljToGxbYYQuartz"/>
</property>
<!-- 调用类中的方法 -->
<property name="targetMethod" value="dataChange">
</property>
</bean>
<bean id="HljToGxbYYDataChangeTrigger" class="org.springframework.scheduling.quartz.CronTriggerFactoryBean">
<property name="jobDetail" ref="HljToGxbYYDataChangeTask" />
<!-- 每1分钟执行一次 -->
<property name="cronExpression" value="0 * * * * ?" />
</bean>
<bean id="myDzfwStartQuertz" lazy-init="true" autowire="no" class="org.springframework.scheduling.quartz.SchedulerFactoryBean" >
<property name="triggers">
<list>
<ref bean="MyDzfwTrigger"/>
<ref bean="HljToGxbDataChangeTrigger"/>
<ref bean="HljToGxbZskDataChangeTrigger"/>
<ref bean="HljToGxbYYDataChangeTrigger"/>
</list>
</property>
</bean>
</beans>
定时任务完成后,就编写实现类与方法
package com.zrar.main.quartz;
import com.alibaba.fastjson.JSONObject;
import com.zrar.easyweb.core.util.PropertyManager;
import com.zrar.easyweb.persistence.core.IBaseZrarDao;
import com.zrar.main.zskbo.ZlInfoBO;
import com.zrar.main.zskbo.ZlInfoNrBO;
import com.zrar.main.util.HttpRequestUtil;
import com.zrar.main.vo.ExchCaseTriggerVO;
import javax.annotation.Resource;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public class HljToGxbZskQuartz {
private static String HLJTOGXBZSK_URL= PropertyManager.getProperty("HLJTOGXBZSK_URL","application");
//黑龙江知识库的ZL_INFO、ZL_INFO_NR
public static Map<String, Class> zsk= new HashMap<String, Class>();
static {
zsk.put("ZL_INFO", ZlInfoBO.class);
zsk.put("ZL_INFO_NR", ZlInfoNrBO.class);
}
@Resource
private IBaseZrarDao daozsk;
public void dataChange() {
String sql="select * from EXCH_TRIGGER order by to_number(LIST_ID)";
String sql1="delete from EXCH_TRIGGER where LIST_ID=?";
List<ExchCaseTriggerVO> ls= daozsk.getList(sql, ExchCaseTriggerVO.class);
for(ExchCaseTriggerVO vo:ls) {
String cid=vo.getInfoCtrlid();
String stat=vo.getInfoCtrlstate();
String table=vo.getListTable().toUpperCase();
String id=vo.getListId();
Map<String,Object> m1= new HashMap<String, Object>();
m1.put("cid", cid);
m1.put("stat", stat);
m1.put("table", table);
if("1".equals(stat)||"2".equals(stat)) {
Object obj=daozsk.getBO(zsk.get(table), cid);
m1.put("obj", obj);
}
String s= HttpRequestUtil.httpRequest(HLJTOGXBZSK_URL, m1);
JSONObject jo= JSONObject.parseObject(s);
String code=jo.getString("code");
if("0".equals(code)) {
daozsk.update(sql1,id);
}
}
}
}
package com.zrar.main.util;
import java.nio.charset.StandardCharsets;
import org.apache.commons.lang.StringUtils;
import org.apache.http.HttpResponse;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.entity.StringEntity;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.message.BasicHeader;
import org.apache.http.util.EntityUtils;
import com.alibaba.fastjson.JSON;
import com.zrar.easyweb.core.util.PropertyManager;
public class HttpRequestUtil {
private static String url=PropertyManager.getProperty("JH_URL","application");
/**
* 发起https请求并获取结果
*
* @param requestUrl 请求地址
* @param commoninfo 提交的数据
* @return
*/
public static String httpRequest(String requestUrl, Object commoninfo){
//返回的code -1 为失败
String result = "{"message": "%s","code": "-1"}";
HttpClient client = HttpClients.createDefault();
if(StringUtils.isEmpty(requestUrl)){
requestUrl=url;
}
try {
HttpPost post = new HttpPost(requestUrl);
String materialInfo=JSON.toJSONString(commoninfo);
post.setHeader(new BasicHeader("content-type", "text/plain;charset=utf-8"));
//String body =materialInfo;
post.setEntity(new StringEntity(materialInfo,StandardCharsets.UTF_8));
//发送请求
HttpResponse response = client.execute(post);
//从response获取返回内容
result= EntityUtils.toString(response.getEntity());
System.out.println(result);
}catch(Exception e){
e.printStackTrace();
result=String.format(result,"调用接口失败,异常信息:"+e.toString());
}
return result;
}
}
第三步、系统A数据推送到接口方处理数据,存储到系统B中。
package com.zrar.main.blh;
import com.alibaba.fastjson.JSONObject;
import com.zrar.easyweb.persistence.core.IBaseZrarDao;
import com.zrar.easyweb.web.core.annotation.BLH;
import com.zrar.easyweb.web.core.annotation.Mapping;
import com.zrar.easyweb.web.core.event.IZrarRequest;
import com.zrar.easyweb.web.core.event.IZrarResponse;
import com.zrar.easyweb.web.core.event.impl.ZrarResponse;
import com.zrar.main.bo.YwclCaseBO;
import com.zrar.main.bo.YwclLzmxBO;
import com.zrar.main.cxbo.YyfwtjBO;
import com.zrar.main.zskbo.ZlInfoBO;
import com.zrar.main.zskbo.ZlInfoNrBO;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.HashMap;
import java.util.Map;
@BLH("HljToGxbBLH")
@Mapping("/hljToGxbBLH")
public class HljToGxbBLH {
public static Map<String, Class> m= new HashMap<String, Class>();
public static Map<String, Class> zsk= new HashMap<String, Class>();
public static Map<String, Class> yyfwtj= new HashMap<String, Class>();
static {
m.put("CCS_CASE_TRANSFER_T", YwclLzmxBO.class);
m.put("CCS_CASE_BASE_T", YwclCaseBO.class);
zsk.put("ZL_INFO", ZlInfoBO.class);
zsk.put("ZL_INFO_NR", ZlInfoNrBO.class);
yyfwtj.put("TJ_YYFWFX", YyfwtjBO.class);
}
@Resource
private IBaseZrarDao dao;
@Resource
private IBaseZrarDao daozsk;
@Resource
private IBaseZrarDao daocx;
/**
* 获取传输的数据
* @param request
* @return
*/
private String getQueryString(HttpServletRequest request){
StringBuffer sb = new StringBuffer();
InputStream is = null;
InputStreamReader isr = null;
BufferedReader br = null;
try{
is = request.getInputStream();
isr = new InputStreamReader(is, "UTF-8");
br = new BufferedReader(isr);
String ss = "";
while ((ss = br.readLine()) != null) {
sb.append(ss);
}
}catch(Exception e){
e.printStackTrace();
}finally{
if(br != null){
try {
br.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if(isr != null){
try {
isr.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if(is != null){
try {
is.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
return sb.toString();
}
/**
* @Description:黑龙江工信部数据同步至部里(主表和流转明细表)
* CCS_CASE_TRANSFER_T
CCS_CASE_BASE_T
* @Author: simajilai
* @date: 2022/9/5 17:13
**/
@Mapping("/hljToGxbDataChange")
public IZrarResponse hljToGxbDataChange(IZrarRequest req) {
IZrarResponse res = new ZrarResponse();
HttpServletRequest request=req.getHttpServletRequest();
//获取参数流
String queryString=getQueryString(request);
//
System.out.println(queryString);
JSONObject jo= JSONObject.parseObject(queryString);
String table=jo.getString("table");
String stat=jo.getString("stat");
String cid=jo.getString("cid");
Class c=m.get(table);
if("3".equals(stat)) {
Object o=dao.getBO(c, cid);
if(o!=null) {
dao.deleteBO(o);
}
}else if("1".equals(stat)||"2".equals(stat)) {
JSONObject jo1= jo.getJSONObject("obj");
Object o=JSONObject.parseObject(jo1.toString(), c);
dao.saveOrUpdateBO(Arrays.asList(o));
}
res.addResHtml("{"code":"0","message":"数据交互成功"}");
return res;
}
/**
* @Description:
* @Author: simajilai
* @date: 2022/9/6 8:41
**/
@Mapping("/hljToGxbZskDataChange")
public IZrarResponse hljToGxbZskDataChange(IZrarRequest req) {
IZrarResponse res = new ZrarResponse();
HttpServletRequest request=req.getHttpServletRequest();
//获取参数流
String queryString=getQueryString(request);
//
System.out.println(queryString);
JSONObject jo= JSONObject.parseObject(queryString);
String table=jo.getString("table");
String stat=jo.getString("stat");
String cid=jo.getString("cid");
Class c=zsk.get(table);
if("3".equals(stat)) {
Object o=daozsk.getBO(c, cid);
if(o!=null) {
daozsk.deleteBO(o);
}
}else if("1".equals(stat)||"2".equals(stat)) {
JSONObject jo1= jo.getJSONObject("obj");
Object o=JSONObject.parseObject(jo1.toString(), c);
daozsk.saveOrUpdateBO(Arrays.asList(o));
}
res.addResHtml("{"code":"0","message":"数据交互成功"}");
return res;
}
/**
* @Description:语音服务统计
* @Author: simajilai
* @date: 2022/9/6 16:06
**/
@Mapping("/hljToGxbYYDataChange")
public IZrarResponse hljToGxbYYDataChange(IZrarRequest req) {
IZrarResponse res = new ZrarResponse();
HttpServletRequest request=req.getHttpServletRequest();
//获取参数流
String queryString=getQueryString(request);
//
System.out.println(queryString);
JSONObject jo= JSONObject.parseObject(queryString);
String table=jo.getString("table");
String stat=jo.getString("stat");
String cid=jo.getString("cid");
Class c=yyfwtj.get(table);
if("3".equals(stat)) {
Object o=daocx.getBO(c, cid);
if(o!=null) {
daocx.deleteBO(o);
}
}else if("1".equals(stat)||"2".equals(stat)) {
JSONObject jo1= jo.getJSONObject("obj");
Object o=JSONObject.parseObject(jo1.toString(), c);
daocx.saveOrUpdateBO(Arrays.asList(o));
}
res.addResHtml("{"code":"0","message":"数据交互成功"}");
return res;
}
}
第四步、如果数据同步涉及到不同的库,什么应用库、查询库、知识库之类的,那么就需要配置数据源。。。
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.0.xsd ">
<!-- 定义受环境影响易变的变量 载入属性文件 -->
<context:property-placeholder location="classpath*:*.properties" />
<!--
Oracle/SqlServer -->
<bean id="dataSourceTargetcx" class="com.alibaba.druid.pool.DruidDataSource" init-method="init" destroy-method="close">
<property name="driverClassName" value="${cx.hibernate.connection.driver_class}"></property>
<property name="url" value="${cx.hibernate.connection.url}" />
<property name="username"><value>${cx.hibernate.connection.username}</value></property>
<property name="password" value="${cx.hibernate.connection.password}"/>
<property name="filters"><value>stat</value></property>
<property name="maxActive"><value>50</value></property>
<property name="initialSize"><value>1</value></property>
<property name="maxWait"><value>60000</value></property>
<property name="minIdle"><value>1</value></property>
<property name="timeBetweenEvictionRunsMillis"><value>60000</value></property>
<property name="minEvictableIdleTimeMillis"><value>300000</value></property>
<property name="validationQuery"><value>SELECT 'x' from dual</value></property>
<property name="testWhileIdle"><value>true</value></property>
<property name="testOnBorrow"><value>false</value></property>
<property name="testOnReturn"><value>false</value></property>
<property name="poolPreparedStatements"><value>true</value></property>
<property name="maxOpenPreparedStatements"><value>20</value></property>
</bean>
<!-- 数据源配置 -->
<bean id="sessionFactorycx"
class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">
<property name="dataSource" ref="dataSourceTargetcx" />
<!-- <property name="namingStrategy">
<bean class="org.hibernate.cfg.ImprovedNamingStrategy" />
</property> -->
<property name="hibernateProperties">
<props>
<prop key="hibernate.dialect">${hibernate.dialect}</prop>
<prop key="hibernate.show_sql">${hibernate.show_sql}</prop>
<prop key="hibernate.format_sql">${hibernate.show_sql}</prop>
<prop key="hibernate.generate_statistics">false</prop>
</props>
</property>
<property name="packagesToScan">
<list>
<value>com.zrar.main.cxbo</value>
</list>
</property>
</bean>
<!-- 默认数据源对象 -->
<bean id="persistemce_oraclecx" class="org.springframework.orm.hibernate4.HibernateTemplate">
<property name="sessionFactory" ref="sessionFactorycx"></property>
</bean>
<bean id="persistemce_oracle_jdbccx" class="org.springframework.jdbc.core.JdbcTemplate">
<property name="dataSource" ref="dataSourceTargetcx"></property>
</bean>
<!-- Mybatis DataSource Configuration -->
<bean id="sqlSessionFactorycx" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="dataSourceTargetcx" />
<property name="configLocation" value="classpath:mybatis-config.xml" />
<property name="mapperLocations" value="classpath*:mappers/**/*.xml"></property>
</bean>
<bean id="sqlSessioncx" class="org.mybatis.spring.SqlSessionTemplate">
<constructor-arg index="0" ref="sqlSessionFactorycx" />
</bean>
<!-- 数据库操作接口 -->
<bean id="daocx" class="com.zrar.easyweb.persistence.core.factory.BaseZrarDaoFactory">
<property name="hbTemplate" ref="persistemce_oraclecx" />
<property name="jdbcTemplate" ref="persistemce_oracle_jdbccx" />
<property name="sqlSession" ref="sqlSessioncx"></property>
</bean>
</beans>
配置多个数据源的文件application.properties。
# [u6570u636Eu5E93u914Du7F6E]
#hibernate.connection.driver_class=oracle.jdbc.driver.OracleDriver
#hibernate.connection.url=jdbc:oracle:thin:@192.168.2.242:1521:ora242
#hibernate.connection.username=gxb12381
#hibernate.connection.password=gxb12381
hibernate.connection.driver_class=dm.jdbc.driver.DmDriver
hibernate.connection.url=jdbc:dm://192.168.2.240:5236
hibernate.connection.username=hlj12381
hibernate.connection.password=arkj123456
hibernate.dialect=org.hibernate.dialect.OracleDialect
hibernate.default_schema=gxb
hibernate.show_sql=false
hibernate.format_sql=true
cx.hibernate.connection.driver_class=dm.jdbc.driver.DmDriver
cx.hibernate.connection.url=jdbc:dm://192.168.2.240:5236
cx.hibernate.connection.username=hlj12381cx
cx.hibernate.connection.password=arkj123456
zsk.hibernate.connection.driver_class=dm.jdbc.driver.DmDriver
zsk.hibernate.connection.url=jdbc:dm://192.168.2.240:5236
zsk.hibernate.connection.username=hljzsk
zsk.hibernate.connection.password=arkj123456
# Redis settings
# server IP
redis.host=192.168.8.1
# server port
redis.port=6379
# use dbIndex
redis.database=0
redis.password=
# u63a7u5236u4e00u4e2apoolu6700u591au6709u591au5c11u4e2au72b6u6001u4e3aidle(u7a7au95f2u7684)u7684jedisu5b9eu4f8b
redis.maxIdle=300
# u8868u793au5f53borrow(u5f15u5165)u4e00u4e2ajedisu5b9eu4f8bu65f6uff0cu6700u5927u7684u7b49u5f85u65f6u95f4uff0cu5982u679cu8d85u8fc7u7b49u5f85u65f6u95f4(u6bebu79d2)uff0cu5219u76f4u63a5u629bu51faJedisConnectionExceptionuff1b
redis.maxWait=3000
# u5728borrowu4e00u4e2ajedisu5b9eu4f8bu65f6uff0cu662fu5426u63d0u524du8fdbu884cvalidateu64cdu4f5cuff1bu5982u679cu4e3atrueuff0cu5219u5f97u5230u7684jedisu5b9eu4f8bu5747u662fu53efu7528u7684
redis.testOnBorrow=true
# u6700u5927u8fdeu63a5u6570
redis.maxActive=300
JH_URL=http://127.0.0.1:8800/api/dataChange
HLJTOGXB_URL=http://127.0.0.1:8800/hljToGxbBLH/hljToGxbDataChange
HLJTOGXBZSK_URL=http://127.0.0.1:8800/hljToGxbBLH/hljToGxbZskDataChange
HLJTOGXBYY_URL=http://127.0.0.1:8800/hljToGxbBLH/hljToGxbYYDataChange
最后
以上就是娇气大叔为你收集整理的Java代码实现不同应用系统中数据同步程序的全部内容,希望文章能够帮你解决Java代码实现不同应用系统中数据同步程序所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复