教程 > sequelize 中文教程 > 阅读:317

sequelize 乐观锁、读取复制与连接池——迹忆客-ag捕鱼王app官网

乐观锁

sequelize 内置支持通过模型实例版本计数进行乐观锁。

乐观锁默认情况下处于禁用状态,可以通过在特定模型定义或全局模型配置中将 version 属性设置为 true 来启用。 有关更多详细信息,请参见模型基础

乐观锁允许并发访问模型记录以进行编辑,并防止冲突覆盖数据。 它通过检查自从读取以来另一个进程是否对记录进行了更改,并在检测到冲突时抛出 optimisticlockerror 来执行此操作。


读取复制

sequelize 支持 读取复制, 即,当你要执行 select 查询时,可以连接多个服务器。 当你执行读取复制时,你可以指定一台或多台服务器充当读取副本,并指定一台服务器充当写入主机,该主机处理所有写入和更新并将它们传播到副本(请注意,实际复制过程 不是 由 sequelize 处理,而应由数据库后端设置)。

const sequelize = new sequelize('database', null, null, {
  dialect: 'mysql',
  port: 3306,
  replication: {
    read: [
      { host: '8.8.8.8', username: 'read-1-username', password: process.env.read_db_1_pw },
      { host: '9.9.9.9', username: 'read-2-username', password: process.env.read_db_2_pw }
    ],
    write: { host: '1.1.1.1', username: 'write-username', password: process.env.write_db_pw }
  },
  pool: { // 如果要覆盖用于 读/写 池的参数,可以在此处执行
    max: 20,
    idle: 30000
  },
})

如果你有适用于所有副本的常规设置,则无需为每个实例提供它们。 在上面的代码中,数据库名称和端口将传播到所有副本。 如果将用户名和密码留给任何副本,则同样会生效。 每个副本具有以下参数:host, port, username, password, database。

sequelize 使用池来管理与副本的连接。 在内部,sequelize 将维护使用 pool 配置创建的两个池。

如果要修改这些设置,可以在实例化 sequelize 时将 pool 作为参数传递,如上所示。

每个 write 或 usemaster: true 查询都将使用写入池。 对于 select,将使用读取池。 使用基本的循环调度来切换只读副本。


连接池

如果要从单个进程连接到数据库,则应仅创建一个 sequelize 实例。 sequelize 将在初始化时建立连接池。 可以通过构造函数的 options 参数(使用 options.pool)来配置此连接池,如以下示例所示:

const sequelize = new sequelize(/* ... */, {
  // ...
  pool: {
    max: 5,
    min: 0,
    acquire: 30000,
    idle: 10000
  }
});

如果要从多个进程连接到数据库,则必须为每个进程创建一个实例,但是每个实例的最大连接池大小应达到最大总大小。 例如,如果你希望最大连接池大小为90,并且有三个进程,则每个进程的 sequelize 实例的最大连接池大小应为30。

查看笔记

扫码一下
查看教程更方便
网站地图