Ruby中的数据库连接池

7

我刚开始接触Ruby,并且正在使用Sinatra,但是找不到一种在请求之间共享数据库连接的方法。

我以前从事Java Web开发,其中一个基本的任务就是对数据库连接进行池化,所以我相信Ruby中也有类似的东西,但是我就是找不到它。

ActiveRecord和DataMapper提供了这个功能,但是我不需要ORM,只想进行常规的SQL查询。

对于Sinatra是否有特定的方法或者是否有适用于所有基于Rack的应用程序的通用方法?

1个回答

5
为了保持连接,你只需要创建一个实例变量(Sinatra应用程序本质上就是对象)或全局变量。 或者创建一个管理连接的类。 我见过的大多数Ruby数据库库都是Database Adapters或仅仅是客户端。
@db = Mysql2::Client.new #...

或者使用全局变量:
$db = Mysql2::Client.new #...

连接池只是一种在应用程序生命周期内,将少量连接共享给多个线程/纤程的方法。据我所知,Java、JVM并不会在进程之间共享连接。
然而,Ruby有一个通用的连接池库

谢谢,但是如果我创建了一个实例变量,每次应用程序对象被创建时,都会创建一个新的连接,对吗? 那么如何实现共享连接呢? - Nikoi
1
应用程序在请求之间不会关闭,除非您手动关闭它。该应用程序已加载并将响应请求,并在其生命周期内保持其连接。这是我所知道的Ruby连接池的最佳实践。 - Robert K
1
直接使用Mysql2可能不是一个好主意,除非使用像SequelDataMapperActiveRecord这样的ORM。在大多数情况下,它们会自动为您进行池化。如果你只是“做SQL查询”,你的应用程序很快就会变得一团糟。Sequel是最好的选择,因为它可以让你尽可能地接近SQL而不必实际去那里,因为查询生成器真的非常好。 - tadman
@tadman 在Java中,ORM往往非常慢,这就是我不使用它们的主要原因。 - Nikoi
1
@Nikoi,Ruby的Sequel非常出色,运行速度极快。你可以看一下它。 - the Tin Man
显示剩余3条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接