【问题标题】:No cache on rust-dieselrust-diesel 上没有缓存
【发布时间】:2020-09-06 13:10:14
【问题描述】:

我使用 MySQL 作为我的数据库,并使用柴油来检索数据。数据每秒从多个端点更新。问题是在使用柴油检索数据时,我得到的结果已经过时(可能是由于柴油端的缓存)。 MySQL 使用SET GLOBAL query_cache_size = 0 运行,因此数据库服务器端没有活动缓存。

这是我检索数据的代码部分:

pub struct Weather {
    pub id: u32,
    pub temperature: f32,
    pub datetime: NaiveDateTime,
}

pub fn {
    let timewindow = ... // A timewindow I set
    let results = weather.filter(datetime.ge(timewindow)).load::<Weather>(&db).unwrap();
    println("{:?}", results)
}

您知道如何停用柴油机上的缓存吗?

【问题讨论】:

  • 请提供一个minimal reproducible example 来显示异常行为。据我所知,柴油机本身没有缓存。
  • 问题是我总是检索相同的结果,尽管当我观察数据库时结果已经被改变了。然后在 1-2 分钟后,我检索到新结果。之后,数据库中没有任何新内容。然后在 1-2 分钟后再次出现新结果,等等。
  • 作为柴油机维护者之一,我可以肯定地告诉您:柴油机中没有用于查询结果的缓存,此查询仅返回柴油机从数据库中返回的那些数据.所以这要么是您的查询有问题,要么是一般设置问题。
  • 有没有办法执行类似的操作:SELECT SQL_NO_CACHE id, name FROM customer;?
  • 这样的事情只能通过原始的sql_query来实现。

标签: caching rust rust-diesel


【解决方案1】:

Diesel reduces boilerplate for database interactions 是在 Rust 中与数据库交互的最有效方式,因为它对查询进行了安全且可组合的抽象。 Diesel 提供了一个高级查询构建器,基本上 Diesel 在抽象时导致零开销,并尝试运行查询和加载数据甚至比在 C 中更快。没有缓存可以导致这种过时的结果,而且它也不支持 SQL_NO_CACHE选项相关查询。过时的结果似乎与其他多个点有关,例如使用的查询或系统设置/设计,在其他 cmets 中也进行了更新。

但是,如果您使用prepared statements,它们可以在重复使用您准备的相同语句时提高性能(语句将被缓存以供将来调用 prepare_cached 时重复使用)。在这种情况下,您也可以set the maximum number of cached prepared statements the particular connection will hold,因为在这种情况下,默认情况下,一个连接将保存相对较少数量的缓存语句。

【讨论】:

    猜你喜欢
    • 2021-12-24
    • 2022-07-14
    • 2023-04-04
    • 2021-11-24
    • 2021-10-31
    • 1970-01-01
    • 2021-03-30
    • 2019-04-18
    • 2019-06-02
    相关资源
    最近更新 更多