应用访问多个DB的方法

发布于:2024-05-11 ⋅ 阅读:(20) ⋅ 点赞:(0)

应用开发一般情况只会使用一个DB视图(多DB集群同步复制的可以视为一个DB,它们之间的数据同步策略可以由DBA来配置,跟开发人员无关),如果需要访问其他应用的DB,不建议直接连到DB操作,而是通过封装好的web服务接口来访问。
那有没有就是要直接用不同服务器上的DB的场景呢?这个不好说,不过技术上也没有什么问题,像nodejs本来就是可以直接连接不同服务器上的数据库,甚至是异构的也没有问题(比如一个是mysql,另一个是mariadb),跨数据库的数据复制抽取可以这样弄下。下面是例程:

var jargs = require('./argspw.json'); //json配置文件
require('bytenode');
const mycrypt = require('./mycrypt.jsc');  //自己写的加解密算法,口令密文存放于json配置文件,需要解密

const mysql = require("mysql"); 
const remotepool= mysql.createPool({
	host:jargs.mysqlip1,
	user:jargs.mysqluser1,
	password:mycrypt.decrypt(jargs.mysqlpw1),
	port:jargs.mysqlport1,
	database:jargs.mysqldatabase1
	});
const localpool= mysql.createPool({
	host:jargs.mysqlip2,
	user:jargs.mysqluser2,
	password:mycrypt.decrypt(jargs.mysqlpw2),
	port:jargs.mysqlport2,
	database:jargs.mysqldatabase2
	});

const getfiles = 'select * FROM locfiles where recvtime> current_date() )'; //当天新记录
const addfiles = 'insert into locfilesc(reqid,filename,filesize,recvtime) values ?' ;

remotepool.getConnection((errmpgc, remoteconn)=> { if (errmpgc) { console.log("建立连接失败"); } else {
	remoteconn.query(getfiles,(errq1,results1)=> { 
		if (errq1) { console.log("SQL执行失败"); console.log(errq1); }
		else { 
			console.log("SQL执行成功"); console.log(JSON.stringify(results1)); 
			let tfds=[]
			results1.forEach(item=>{tfds.push(Object.values(item))});
			localpool.getConnection((errmpgc, localconn)=> { if (errmpgc) { console.log("建立连接失败"); } else {
				localconn.query(addfiles,[tfds],(errq2,results2)=> { 
					if (errq2) { console.log("SQL执行失败"); console.log(errq2); }
					else { console.log("SQL执行成功"); console.log(JSON.stringify(results2)); }
					})
				localconn.release();
				}})
			}
		})
	remoteconn.release();
	}});

开发一般还可以尝试使用mysql的FEDERATED引擎,开启FEDERATED引擎后,在远程DB中创建连接用户并授权库表权限,然后在本地DB中使用FEDERATED引擎连接远程DB创建表,之后就可以像访问本地DB库表一样操作远程DB的库表。
另外,MySQL官方工具Workbench中Schema Transfer Wizard可以在不同服务器之间进行库表迁移,主要是db运维人员操作。


网站公告

今日签到

点亮在社区的每一天
去签到