加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

ruby-on-rails – Rails是否无限期地使用单个“数据库会话”?

发布时间:2020-12-16 21:07:42 所属栏目:百科 来源:网络整理
导读:我在Rails应用程序中有自定义 PostgreSQL prepared statements的用例(除了 what ActiveRecord does automatically). 我的用例是批量插入一堆行,例如: PREPARE insert_2_events (text,text,timestamp,int,json,timestamp)ASINSERT INTO events (uuid,kind,ge
我在Rails应用程序中有自定义 PostgreSQL prepared statements的用例(除了 what ActiveRecord does automatically).

我的用例是批量插入一堆行,例如:

PREPARE insert_2_events (text,text,timestamp,int,json,timestamp)
AS
INSERT INTO events (uuid,kind,generated_at,team_id,data,created_at,updated_at)
VALUES
($1,$2,$3,$4,$5,$6,$7),($8,$9,$10,$11,$12,$13,$14)
ON CONFLICT(uuid) DO NOTHING;

EXECUTE insert_2_events(
  'ed8bd52a-4ea9-4548-ab02-87adfca90789','call','2017-04-06T16:14:20-04:00',1,'{"some":"data"}','2017-04-06T20:14:20+00:00','27c3251e-aff0-4005-918a-d7011f984515','text','{awesome:true}','2017-04-06T20:14:20+00:00'
);

我不知道,对于任何给定的执行,是否会有2行显示,10行或其他.所以我希望能够做到的是:

>如果我的方法被调用3行,看看我是否已经预先准备了这个语句的3行版本.
>如果没有,请准备它
>执行它

我可以跟踪“我已经准备好了吗?”在应用程序代码中,但我不确定它是否可靠.

PostgreSQL docs say:

Prepared statements only last for the duration of the current database session. When the session ends,the prepared statement is forgotten,so it must be recreated before being used again. This also means that a single prepared statement cannot be used by multiple simultaneous database clients; however,each client can create their own prepared statement to use. Prepared statements can be manually cleaned up using the DEALLOCATE command.

我不确定“数据库会话”概念如何映射到Rails应用程序.

> Rails应用程序在运行的整个过程中是否会使用相同的数据库会话?
>将不同的实例(Unicorn工作进程,Puma线程或其他)视为不同的数据库客户端(我认为是这样),在这种情况下,我需要跟踪在线程局部变量中准备的语句?

我有一个原型工作,我总是准备语句,并在执行后始终DEALLOCATE它,但这似乎是非常低效的.

这一切都可能过于苛刻而不实用,但它至少是有趣的.

解决方法

PostgreSQL和Rails对同一事物使用不同的词:PostgresSQL中的会话对应于Rails中的连接.

Will the Rails app be using the same database session the whole time it’s running?

简短的回答:它试图.

答案很长:Rails维护一个线程安全的pool个连接/会话.每个请求都会从池中借用一个连接,然后返回.

如果没有现有连接,例如在第一次请求时或者如果检出所有活动连接,Rails将打开一个新连接(直到达到最大连接数)

因此,除非连接关闭(例如手动或通过PgBouncer),否则在整个应用程序生命周期内最终会得到相同的连接.

Will different instances (Unicorn worker processes,Puma threads,or whatever) be considered different database clients

流程:是的.

线程:这取决于.并发线程肯定会获得自己的连接,但如果在任何时候只有一个活动的线程,那么它们很可能从池中获得相同的连接.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读