#连接管理器 #bb8-连接 #rusqlite #tokio

bb8-sqlite

A bb8 连接管理器用于 rusqlite

1 个不稳定发布

0.1.0 2023年1月7日

#18#bb8-连接

MIT 许可证

13KB
149

bb8-rusqlite

crates.io version MIT licence Documentation Build state

此crate提供了一个连接管理器,您可以使用它与bb8一起提供bb8连接池。

示例

查看examples/basic.rs以获取自包含示例,但基本上,它看起来是这样的

let manager = RusqliteConnectionManager::new("my-database.db");
let pool = bb8::Pool::builder().build(manager).await?;

// ...

let conn = pool.get().await?;
// conn is a rusqlite::Connection, so do whatever you'd normally do with it!

注意事项

不支持内存数据库

rusqlite 允许使用 Connection::open_in_memory 系列方法创建内存数据库。内存SQLite数据库是针对每个连接的,这意味着拥有这些连接的池会导致每个连接都有自己的、完全独立的数据库!

这会很令人困惑,因此不提供这些方法的包装器。此外,除非您喜欢代码中的非常奇怪的错误,否则不应使用 rusqlite::OpenFlags::SQLITE_OPEN_MEMORY

rusqlite::Connection 仍然非常同步

bb8 在底层大量使用tokio,而此连接管理器也是如此。但是,您最终将处理 rusqlite::Connection 实例,而这些实例不提供任何异步API。

如果您关心并发性,您应该注意避免通过将任务标记为使用 Connection 阻塞来长时间占用运行时。您可以通过将 Connection 移动到另一个阻塞任务或使用 tokio::task::block_in_place() 来这样做。实际上,在大多数情况下,您可能希望使用后者:移动 Connection 实例充满危险,因为它们没有实现 Sync

需要tokio的多线程运行时

由于上述 Connection 同步性,bb8-rusqlite 必须 与多线程执行器一起使用,以便可以使用 tokio::task::block_in_place()

未来可能性

bb8-diesel 采用了一种有趣的方法:通过使用 block_in_place() 包装同步 Diesel API,它提供了一种更安全、仍然是同步的 API,减少了线程池饥饿的可能性。

在此可以开展的一个有趣的工作是做同样的事情:使用 block_in_place()rusqlite 类型包裹在包装器中,然后实现一个返回这些连接管理器而不是原始 rusqlite::Connection 实例的连接管理器。这比较困难,因为 Connection 是一个具体类型而不是特质,但通过大量的模板代码和一些 Deref 实现作为备选方案,应该可以做到。自私地讲,我现在并不需要它!

依赖关系

~32MB
~508K SLoC