现代 Web 应用中,ORM 框架是很常见的一种框架,其可以将数据库表的结构映射到开发语言中的对象,提供了一种更加面向对象的常规数据访问方式,尤其在快速开发的中小型公司中使用广泛。Fastify 是一位 Node.js 社区非常受欢迎的 Web 框架,其性能极佳,但是在使用 ORM 框架时,也需要考虑性能优化的问题。
本文将探讨 Fastify 框架中如何使用 ORM 框架,以及对 ORM 框架进行性能优化的方法。
1. ORM 框架的基本概念
ORM,Object-Relational Mapping,对象-关系映射,它是一种将关系型数据库表示为对象的方式。开发人员不必与 SQL 查询或为对象/关系之间映射写代码来调用数据库了。ORM 客户端负责管理数据库连接并处理查询,以及将服务器端语言中的数据类型与数据库中的类型转换。ORM 将数据库存储视为常规对象,其中每个行映射到一个对象,每个列映射到对象的属性,即 ORM 将数据库的行和列映射到实际使用面向对象语言编写的实现上。
ORM 框架的优点:
- 避免了将代码与底层存储细节耦合在一起
- 模型实现相对容易,易于维护
- 支持易于实现的代码重用、模块化和可移植性,尤其是开发大型企业级应用程序时
- ORM 框架通常更易于学习和阅读,这也为新开发人员的培养提供了良好的平台
2. 在 Fastify 框架中使用 ORM 框架
ORM 框架是与关系型数据库绑定的,可以使用 MySQL、PostgreSQL、SQL Server 等数据库。常用的 ORM 框架有 Sequelize、TypeORM、Prisma。这里以使用 Sequelize 为例。
首先,需要在项目中安装 Sequelize。
npm install sequelize
然后,在 Fastify 项目中建立一个 Sequelize 实例,并指定连接 URL,示例如下:
const sequelize = new Sequelize('database', 'username', 'password', { host: 'localhost', dialect: 'mysql' });
连接池是一个维护数据库连接的池,它有助于减少连接和断开连接的开销,从而减少了整体延迟。将 Sequelize 与连接池一起使用,可以提高性能。
下面,展示在 Fastify 声明周期中使用 Sequelize 的示例代码:
-- -------------------- ---- ------- ----- ------- - ----------------------- ----- --------- - --------------------- -- -- --------- -- ----- --------- - --- --------------------- ----------- ----------- - ----- ------------ -------- ------- --- -------------------------- ---------- ----- -- - ------------------ ------- --- ----------------------------- ----------- --------- --------------- -------- -- - ----------------------- --- ---- ----------- ---------------- -- ---------- -- - --------------------- -- ------- -- --- ----------- ----- --- -------------------- ----- -------- -- - -- ----- ----- ---- ------------------- --------- -- ------------- ---
这里使用 fastify.decorate
向 fastify 实例中添加 sequelize
属性,将之后我们在路由中使用的 ORM 实例维持在全局范围内。fastify.addHook
被 Fastify 框架用来管理服务器生命周期,这里将其用来在实例关闭时关闭 Sequelize 建立的数据库连接。
3. Sequelize ORM 的性能优化
Sequelize ORM 可以支持事务处理,多次查询数据,并可以与 MySQL、PostgreSQL、SQL Server 等数据库实现交互。如果使用不当,可能会导致性能下降,所以我们需要一个优化方法。
3.1 合并查询
当需要检索多个数据源并将数据合并为单个对象时,可以利用 Sequelize 内置支持的 accessor 功能和 eager loading,避免了多次查询数据库的开销:
-- -------------------- ---- ------- ----- - ----- ---- - - -------------------- -- - ---- ----- -------- ------------------ - ----------- --------- --- ------- --- -- - ---- ----- ---- ---- -------------------- - ----------- --------- --- ------ --- --------------------- ----- ----- ------ -- - ----- ----- - ----- -------------- -------- - - ------ ----- --- ------- - - --- ------------------ ---
这里,我们在 Type
模型上定义了 items
关联属性,定义这个 accessor 之后,我们就可以在 findAll
操作中使用 include 关键字,指定要在查询中包含的关联模型。
3.2 批量操作
良好的性能最大程度上依赖于在单个连接中进行批量操作,这减少了客户端和 DBMS 管理期间的通信开销。例如:
- 批量插入记录
- 批量更新记录
- 批量删除记录
- 考虑缓存 SQL 语句
3.3 限定返回数据的数量
为了性能优化,ORM 应用程序应总是限制返回的记录。通过 limit 和 offset 选项来指定返回的数据量范围。
// 导入 Article 模型 const { Article } = require('./models'); fastify.get('/articles', async (req, reply) => { const articles = await Article.findAll({ limit: 100 }); reply.send(articles); });
3.4 使用索引
在访问大量数据时,使用索引有助于优化数据库性能。为匹配访问查询声明正确类型的索引有望为 SQL 查询提供良好的性能。
Sequelize 中使用索引:
-- -------------------- ---- ------- ----- - ----------------------- - - ------------------------ ----- ---- - ---------------------------- - --------- - ----- --------------------- ---------- ------ ----------- ---- -- --------- -------------------- --- ----------- ------ ---- -- -------- -- ------------------- ------- ------ ----- -------------------------- -- ----- ------------ - - -------- -- ---
这里,createIndex
函数可以在 User
模型中为表的列添加索引。然后使用 Sequelize 查询时,ORM 会优先从索引中获取数据,而不是对整个表进行扫描处理,提高了查询效率。
注意,单个的索引也会增加数据库写入开销,建议在必要时使用索引并进行正确的配置。
3.5 缓存结果
结果缓存可以提高临时结果的访问速度。缓存可以减少 CPU 和磁盘 I/O 的负荷,并提供更快的响应。Redis 是一个非常流行的缓存服务,现在以该服务为例进行缓存和 Sequelize 集成:
-- -------------------- ---- ------- ----- ----- - ------------------- ----- ----- - --- -------- ----- - ---- - - -------------------- ------------------------------ ----- ----- ------ -- - ----- - -- - - ----------- --- ----- - ----- ------------------------ -- ------ --- ----- - ------ ------------------------------ - ----- ---- - ----- -------------- ------ - -- - --- ----- ----------------------- ---------------------- ----------------- ---
这里,Sequelize 连接到 DBMS 以查询数据。如果这是第一次查询,它将读取并将结果写入 Redis 服务中。在第二次查询时,它会快速地将结果从 Redis 中读取出来。
结论
在 Fastify 平台上使用 Sequelize ORM 可以有效地开发出出色的应用程序。在此基础上,本文介绍了检索数据、优化查询、使用索引和结果缓存等多种方法,以帮助用户获得出色的性能和好的体验。
是时候拥抱 Fastify 和 Sequelize ORM 框架,一同推动 Web 服务的开发效率和用户体验的提升。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/66f3fa9bf40ec5a964e65f79