Slick 3.0 在数据库驱动程序级别是反应式/异步的吗?对于哪些数据库?

Posted

技术标签:

【中文标题】Slick 3.0 在数据库驱动程序级别是反应式/异步的吗?对于哪些数据库?【英文标题】:Is Slick 3.0 reactive/asynchronous at the database driver level? For which databases? 【发布时间】:2015-06-18 07:22:53 【问题描述】:

Slick 历来依赖 JDBC 驱动程序,该驱动程序在内部阻塞等待套接字 I/O 以响应查询。每个未完成的数据库调用都需要一个线程在套接字上阻塞;因此,它并不像 ReactiveMongo、postgresql-async 和 mysql-async 那样真正具有反应性,它们一直是异步的。

Slick 3.0 在这方面有什么变化吗?还是我对此感到困惑?

【问题讨论】:

Auctally slick 3.x 的事务性能很差。我做了一个微基准here。 【参考方案1】:

它不是驱动程序级别的异步,但这不是问题。在良好的设置中,等待数据库连接的阻塞线程数应该很小。因此它们不会消耗大量资源。 Slick 管理它们并将阻塞线程调度到它们自己的线程池中,因此它们不会妨碍计算。 “本机”异步驱动程序可能会增加一个较小的加速,但不是主要的。 Slick 可能会在未来的某个时候支持这一点。 “反应式”的主要好处来自 Slick 在 3.0 中已经实现的功能。更广泛的解释可以在这里找到:https://www.parleys.com/tutorial/reactive-slick-database-programming

【讨论】:

我明白你的意思,但我相信在底层analysis 中缺少一个大星号,这会导致连接池大小:* 假设硬件限制是唯一的原因数据库服务器上的负载驱动延迟。虽然这在某些应用程序中可能是正确的,但任何会导致大量锁争用的应用程序,尤其是来自事务的应用程序,可能需要更多的连接来避免池饱和导致的死锁。至少,我是这么认为的。 我决定ask a higher authority 关于死锁问题。 在此处添加了一张票,以查看关于表达的担忧的反应性光滑:github.com/slick/slick/issues/1131 提到的锁定争用和许多长期连接的具体示例(任何数量都会成为线程资源的问题)用法)在这里会很有帮助。 如果你不想注册 parleys youtube.com/watch?v=WvxXz7aklik

以上是关于Slick 3.0 在数据库驱动程序级别是反应式/异步的吗?对于哪些数据库?的主要内容,如果未能解决你的问题,请参考以下文章

Play 2.4 中的 Slick 3.0 事务

批量插入时 Slick 3.0 中的数据库异常

Play 2.4 Slick 3.0 - 删除表中的所有行

无法使用 play-slick 1.0.1/slick 3.0 连接到 mysql 数据库:配置错误

Slick 3.0 批量插入或更新(更新插入)

如何在 slick 3.0 中将 Rep[T] 转换为 T?