1.4-多个Connection_同时开三个connection-程序员宅基地

技术标签: typeorm官方文档  

多个连接,数据库,模式和主从复制设置

使用多个连接

使用多个数据库的最简单方法是创建不同的连接:

import {
    createConnections} from "typeorm";

const connections = await createConnections([{
    
    name: "db1Connection",
    type: "mysql",
    host: "localhost",
    port: 3306,
    username: "root",
    password: "admin",
    database: "db1",
    entities: [__dirname + "/entity/*{.js,.ts}"],
    synchronize: true
}, {
    
    name: "db2Connection",
    type: "mysql",
    host: "localhost",
    port: 3306,
    username: "root",
    password: "admin",
    database: "db2",
    entities: [__dirname + "/entity/*{.js,.ts}"],
    synchronize: true
}]);

此方法允许你连接到已拥有的任意数量的数据库,每个数据库都有自己的配置,自己的实体和整体ORM范围和设置。

对于每个连接,将创建一个新的Connection实例。
你必须为创建的每个连接指定唯一的名称。

也可以从ormconfig文件加载所有连接选项:

import {
    createConnections} from "typeorm";

const connections = await createConnections();

指定要按名称创建的连接:

import {
    createConnection} from "typeorm";

const connection = await createConnection("db2Connection");

使用连接时,必须指定连接名称以获取特定连接:

import {
    getConnection} from "typeorm";

const db1Connection = getConnection("db1Connection");
// 现在可以使用"db1"数据库...

const db2Connection = getConnection("db2Connection");
// 现在可以使用"db2"数据库...

使用此方法的好处是你可以使用不同的登录凭据,主机,端口甚至数据库类型来配置多个连接。

但是缺点可能是需要管理和使用多个连接实例。

在单个连接中使用多个数据库

如果你不想创建多个连接,但是想在一个连接中使用多个数据库,则可以指定使用的每个实体的数据库名称:

import {
    Entity, PrimaryGeneratedColumn, Column} from "typeorm";

@Entity({
     database: "secondDB" })
export class User {
    

    @PrimaryGeneratedColumn()
    id: number;

    @Column()
    firstName: string;

    @Column()
    lastName: string;

}
import {
    Entity, PrimaryGeneratedColumn, Column} from "typeorm";

@Entity({
     database: "thirdDB" })
export class Photo {
    

    @PrimaryGeneratedColumn()
    id: number;

    @Column()
    url: string;

}

user实体将在secondDB数据库内创建,Photo实体则在thirdDB数据库内。

如果要从其他数据库中选择数据,则只需提供一个实体:

const users = await connection
    .createQueryBuilder()
    .select()
    .from(User, "user")
    .addFrom(Photo, "photo")
    .andWhere("photo.userId = user.id")
    .getMany(); // userId因其跨数据库请求而不是外键

此代码将生成以下sql查询(取决于数据库类型):

SELECT * FROM "secondDB"."question" "question", "thirdDB"."photo" "photo" 
    WHERE "photo"."userId" = "user"."id"

还可以指定表而不是实体:

const users = await connection
    .createQueryBuilder()
    .select()
    .from("secondDB.user", "user")
    .addFrom("thirdDB.photo", "photo")
    .andWhere("photo.userId = user.id")
    .getMany(); // userId因其跨数据库请求而不是外键

仅在mysql和mssql数据库中支持此功能。

在单个连接中使用多个模式

你可以在应用程序中使用多个模式,只需在每个实体上设置schema

import {
    Entity, PrimaryGeneratedColumn, Column} from "typeorm";

@Entity({
     schema: "secondSchema" })
export class User {
    

    @PrimaryGeneratedColumn()
    id: number;

    @Column()
    firstName: string;

    @Column()
    lastName: string;

}
import {
    Entity, PrimaryGeneratedColumn, Column} from "typeorm";

@Entity({
     schema: "thirdSchema" })
export class Photo {
    

    @PrimaryGeneratedColumn()
    id: number;

    @Column()
    url: string;

}

user实体将在secondSchema schema中创建,photo实体将在thirdSchema schema中创建。

其他实体将在默认连接架构中创建。

如果要从其他模式中选择数据,则只需提供一个实体:

const users = await connection
    .createQueryBuilder()
    .select()
    .from(User, "user")
    .addFrom(Photo, "photo")
    .andWhere("photo.userId = user.id")
    .getMany(); // userId因其跨数据库请求而不是外键

此代码将生成以下sql查询(取决于数据库类型):

SELECT * FROM "secondSchema"."question" "question", "thirdSchema"."photo" "photo" 
    WHERE "photo"."userId" = "user"."id"

你还可以指定表而不是实体:

const users = await connection
    .createQueryBuilder()
    .select()
    .from("secondSchema.user", "user") // 在mssql中,指定数据库:secondDB.secondSchema.user
    .addFrom("thirdSchema.photo", "photo") // 在mssql中,指定数据库:thirdDB.thirdSchema.photo
    .andWhere("photo.userId = user.id")
    .getMany();

仅在postgres和mssql数据库中支持此功能。

在mssql中,你还可以组合模式和数据库,例如:

import {
    Entity, PrimaryGeneratedColumn, Column} from "typeorm";

@Entity({
     database: "secondDB", schema: "public" })
export class User {
    

    @PrimaryGeneratedColumn()
    id: number;

    @Column()
    firstName: string;

    @Column()
    lastName: string;

}

主从复制

你可以使用TypeORM设置读/写复制。

复制连接设置示例:

{
    
  type: "mysql",
  logging: true,
  replication: {
    
    master: {
    
      host: "server1",
      port: 3306,
      username: "test",
      password: "test",
      database: "test"
    },
    slaves: [{
    
      host: "server2",
      port: 3306,
      username: "test",
      password: "test",
      database: "test"
    }, {
    
      host: "server3",
      port: 3306,
      username: "test",
      password: "test",
      database: "test"
    }]
  }
}

所有模式更新和写入操作都使用master服务器执行。
find方法或select query builder执行的所有简单查询都使用随机的slave实例。

如果要在查询构建器创建的SELECT中显式使用master,可以使用以下代码:

const masterQueryRunner = connection.createQueryRunner("master");
try {
    
    const postsFromMaster = await connection.createQueryBuilder(Post, "post")
        .setQueryRunner(masterQueryRunner)
        .getMany();
} finally {
    
      await masterQueryRunner.release();
}

请注意,需要显式释放由QueryRunner创建的连接。

mysql,postgres和sql server数据库都支持复制。

Mysql支持深度配置:

{
    
  replication: {
    
    master: {
    
      host: "server1",
      port: 3306,
      username: "test",
      password: "test",
      database: "test"
    },
    slaves: [{
    
      host: "server2",
      port: 3306,
      username: "test",
      password: "test",
      database: "test"
    }, {
    
      host: "server3",
      port: 3306,
      username: "test",
      password: "test",
      database: "test"
    }],
    
    /**
    * 如果为true,则PoolCluster将在连接失败时尝试重新连接。 (默认值:true)
    */
    canRetry: true,

    /**
     * 如果连接失败,则节点的errorCount会增加。
     * 当errorCount大于removeNodeErrorCount时,删除PoolCluster中的节点。 (默认值:5)
     */
    removeNodeErrorCount: 5,

    /**
     * 如果连接失败,则指定在进行另一次连接尝试之前的毫秒数。
     * 如果设置为0,则将删除节点,并且永远不会重复使用。 (默认值:0)
     */
     restoreNodeTimeout: 0,

    /**
     * 确定如何选择从库:
     * RR:交替选择一个(Round-Robin)。
     * RANDOM: 通过随机函数选择节点。
     * ORDER: 无条件选择第一个
     */
    selector: "RR"
  }
}
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qq_27664967/article/details/107363013

智能推荐

如何在树莓派部署Nginx并实现无公网ip远程访问内网制作的web网站-程序员宅基地

文章浏览阅读2.1k次,点赞90次,收藏86次。相比其他 Web 服务器,Nginx 的内存占用率非常低,可以在树莓派等资源受限的设备上运行。要注意的是,以上步骤使用的是随机临时地址,该公网地址24小时内会随机变化。打开浏览器,我们来测试一下访问配置成功的二级子域名,出现nginx欢迎界面表示成功,可以正常访问。然后打开在线隧道列表,查看创建隧道的公网地址,默认有两种访问方式,一种是http 另一种是https,复制http地址。,可以看到nginx隧道的公网地址,已经更新为二级子域名了,将公网地址复制下来。,找到需要配置二级子域名的隧道,点击右侧的。

向量相似度java_特征向量相似度和距离的计算-程序员宅基地

文章浏览阅读341次。1/*2特征向量相似度和距离的计算34相似度:5·夹角余弦6·相关系数7·Dice8·Jaccard910距离11·明氏距离12·欧氏距离13·马氏距离14·Jffreys&Matusita距离15·Mahalanobis距离,未实现,协方差矩阵16·Camberra距离(Lance距离,Williams距离)17*/1819#inclu..._java 计算特征向量的相似度

Linux性能测试工具_ubuntu显卡测试工具-程序员宅基地

文章浏览阅读2.1k次。Linux系统出现问题时,我们不仅需要查看系统日志信息,而且还要使用大量的性能监测工具来判断究竟是哪一部分(内存、CPU、硬盘……)出了问题。在Linux系统中,所有的运行参数保存在虚拟目录/proc中,换句话说,我们使用的性能监控工具取到的数据值实际上就是源自于这个目录,当涉及到系统高估时,我们就可以修改/proc目录中的相关参数了,当然有些是不能乱改的。下面就让我们了解一下这些常用的性能监控工_ubuntu显卡测试工具

平台治理开发:分布式系统的消息队列与事件驱动-程序员宅基地

文章浏览阅读247次,点赞5次,收藏9次。1.背景介绍1. 背景介绍分布式系统是现代软件架构中不可或缺的一部分,它们通过将应用程序分解为多个组件,以提高可扩展性、可靠性和可维护性。然而,分布式系统也带来了一系列挑战,包括数据一致性、故障转移和消息传递。消息队列和事件驱动架构是解决这些挑战的关键技术之一。消息队列是一种异步通信机制,它允许不同的组件在不同时间传递消息。事件驱动架构则是一种设计模式,它将系统的行为分解为一系列事件和...

基础练习 闰年判断 C语言_年份是4的倍数而不是100的倍数; 2. 年份是400的倍数。c-程序员宅基地

文章浏览阅读311次。基础练习 闰年判断 C语言描述:给定一个年份,判断这一年是不是闰年。当以下情况之一满足时,这一年是闰年:年份是4的倍数而不是100的倍数;年份是400的倍数。其他的年份都不是闰年。输入:输入描述:输入包含一个整数y,表示当前的年份。输入样例:2013输出:输出描述:输出一行,如果给定的年份是闰年,则输出yes,否则输出no。说明:当试题指定你输出一个字符串作为结果(比如本题的yes或者no,你需要严格按照试题中给定的大小写,写错大小写将不得分。输出样例:no提_年份是4的倍数而不是100的倍数; 2. 年份是400的倍数。c

【Java Web后台实验与开发】The server time zone value ‘�й���׼ʱ��‘ is unrecognized or represents more than one-程序员宅基地

文章浏览阅读1.2k次。文章目录1 错误环境2 错误原因3 解决方案:1 错误环境mysql版本:5.5.02 错误原因使用原mysql5.1.38不会出现该问题因使用了Mysql最新版驱动所以报错3 解决方案:方案1、在项目代码-数据库连接URL后,加上 (注意大小写必须一致)?serverTimezone=UTC方案2、在mysql中设置时区,默认为SYSTEMset global time_z..._the server time zone value

随便推点

渗透测试-SQL注入-SQLMap工具_sqlmap拖库-程序员宅基地

文章浏览阅读843次,点赞16次,收藏22次。用这个工具扫描其它网站时,要注意法律问题,同时也比较慢,所以我们以之前写的登录页面为例子扫描。_sqlmap拖库

origin三图合一_神教程:Origin也能玩转图片拼接组合排版-程序员宅基地

文章浏览阅读1.5w次,点赞5次,收藏38次。Origin也能玩转图片的拼接组合排版谭编(华南师范大学学报编辑部,广州 510631)通常,我们利用Origin软件能非常快捷地绘制出一张单独的绘图。但是,我们在论文的撰写过程中,经常需要将多种科学实验图片(电镜图、示意图、曲线图等)组合在一张图片中。大多数人都是采用PPT、Adobe Illustrator、CorelDraw等软件对多种不同类型的图进行拼接的。那么,利用Origin软件能否实..._origin怎么把三个图做到一张图上

51单片机智能电风扇控制系统proteus仿真设计( 仿真+程序+原理图+报告+讲解视频)_电风扇模拟控制系统设计-程序员宅基地

文章浏览阅读4.2k次,点赞4次,收藏51次。51单片机智能电风扇控制系统仿真设计( proteus仿真+程序+原理图+报告+讲解视频)仿真图proteus7.8及以上 程序编译器:keil 4/keil 5 编程语言:C语言 设计编号:S0042。_电风扇模拟控制系统设计

build.sh脚本-程序员宅基地

文章浏览阅读2.8w次,点赞7次,收藏73次。1开头程序必须以下面的行开始(必须方在文件的第一行):#!/bin/sh符号#!用来告诉系统它后面的参数是用来执行该文件的程序。在这个例子中我们使用/bin/sh来执行程序。当编写脚本完成时,如果要执行该脚本,还必须使其可执行。要使编写脚本可执行:编译chmod +x filename这样才能用./filename来运行2注释在进行shell编程时,以#开头的句子表示..._build.sh

标准库——bitset类型_bitset<32> bits(num);-程序员宅基地

文章浏览阅读338次。关于标准库中sring、vector、set、map、queue、stack 、bitset等,方法有些记不清楚,每次用每次查,很费时间,干脆自己整理一下,记不住的时候,查询更方便。// 需要包含头文件和声明:#include<bitset>using std::bitset;bitset对象的定义和初始化bitset类型对象的区别仅在其长度,而不在其类型。定义时,&..._bitset<32> bits(num);

帆软报表各种情形下引入js_帆软使用js-程序员宅基地

文章浏览阅读804次。3.EncryptionComponent.KEY——$HOST/v10/encryption/page 平台切换国密的时候才可能会用到,主要用于提示异常。8.MigrationComponent.KEY——$HOST/v10/migration/page FineDb迁移数据时的进度页面,在插件中用处不大。12.WorkflowComponent.KEY——$HOST/workflow/authority 单独访问多级上报权限控制页面时生效。被依赖组件——前端页面。被依赖组件——前端页面。_帆软使用js