使用 Kotlin Exposed 进行缓存?

Posted

技术标签:

【中文标题】使用 Kotlin Exposed 进行缓存?【英文标题】:Caching with Kotlin Exposed? 【发布时间】:2019-04-15 01:19:48 【问题描述】:

我想知道在使用 Kotlin-Exposed 库进行 SQL 访问时如何添加缓存。

为了进行实验,我使用 Spring Boot + Hibernate 和 KTOR + Exposed 编写了一个小型应用程序。

我做了一些负载测试,当发布到应用程序的两个版本时,性能与具有优势的 KTOR + Exposed 版本非常相似。

但是,当从两个版本获取现有记录时,差异是令人震惊的,尤其是当数据库变得越来越大时——而且所有时间都在 Postgres 中。 我的结论是,区别只能在于Spring Boot配置的Hibernate二级缓存。

看到缓存对于在多个事务/会话中重复查询的项目的价值,我想知道如何将其配置到低级 Exposed 框架中?

【问题讨论】:

【参考方案1】:

目前 Exposed 仅支持每个事务级别。

此外,还有ImmutableCachedEntityClass,它允许您将一些实体(主要是类似字典的)定义为缓存并在应用程序之间共享它们。 您必须使用 expireCache() 函数手动管理缓存失效或使用 forceUpdateEntity 实现实体。

在分布式系统时代,适当的缓存并不容易实现。您可以使用任何缓存库(例如caffeine)并在您知道数据何时更改时使缓存无效(可能借助 Exposed StatementInterceptors)。

如果您能够实现一个好的缓存解决方案,请随时向项目发送 PR。

【讨论】:

以上是关于使用 Kotlin Exposed 进行缓存?的主要内容,如果未能解决你的问题,请参考以下文章

使用 Kotlin Exposed 创建数据库后连接到数据库

Kotlin Exposed 获取更新的行数

如何通过 Exposed 连接到 Google Cloud SQL

尝试使用JetBrains / Exposed连接到MSSQL数据库

如何避免Kotlin暴露的N + 1查询问题。 (通过DAO的Reference.id.value字段获取值时)

Spring Boot Kotlin 暴露存储过程