慎用establish connection

在一个Rails应用中连接多个数据库,我们常常这么做:

Ruby代码  
  1. class Cookie < ActiveRecord::Base
  2. establish_connection :monitor_spider
  3. ...
  4. end

这样,在使用Cookie.find等操作的时候,就会连接到database.yml中monitor_spider配置的数据库上操作。

以前一直都这么用,没发现什么不妥。最近一个项目,由于启动的进程比较多,老是碰到数据库连接池链接获取超时的错误。通过MySQL Client用命令:show processlist;

发 现数据库连接数量一直居高不下,轻轻松松就上2k+的连接。通过读Rails框架的connection_pool.rb文件代码,发现在各模型中用 establish_connection连接数据库会造成很大的问题。文件中类ConnectionHandler的 establish_connection方法代码如下:

Ruby代码  
  1. def establish_connection(name, spec)
  2. @connection_pools[name] = ConnectionAdapters::ConnectionPool.new(spec)
  3. end

对 应上面Cookie模型的配置,这里name的值会是Cookie。也就是说,有10个模型中使用了establish_connection配 置,@connection_pools中就会初始化10个ConnectionPool,如果每个ConnectionPool的pool size是20,那么应用运行的时候,将需要200(10 × 20)个数据库连接。而我的应用中有两类模型(连接到两个数据库),模型总数40+。按establish_connection的方式设置数据库连接, 那么mysql的连接轻易就被消耗完了。

那要怎么处理呢?

我现在的思路是自己来维护数据库连接池。

首先,对ConnectionAdapters进行一下改造,将如下代码放到initializers中:

Ruby代码  
  1. module ActiveRecord
  2. module ConnectionAdapters
  3. class ConnectionHandler
  4. def specified_establish_connection(name, spec)
  5. @connection_pools[name] = ConnectionAdapters::ConnectionPool.new(spec)
  6. end
  7. def retrieve_connection_pool(klass)
  8. if klass.respond_to?(:pool_name)
  9. pool = @connection_pools[klass.pool_name]
  10. # ActiveRecord::Base.logger.info "pool: #{pool.inspect}"
  11. return pool if pool
  12. end
  13. pool = @connection_pools[klass.name]
  14. # puts pool.inspect
  15. return pool if pool
  16. return nil if ActiveRecord::Base == klass
  17. retrieve_connection_pool klass.superclass
  18. end
  19. end
  20. end
  21. end

在environment.rb中事先连接建立数据库连接池:

Ruby代码  
  1. #specified pool
  2. config =  YAML::load(File.open("config/database.yml"))
  3. %w(monitor_center monitor_spider).each do |pool_name|
  4. spec = config[pool_name]
  5. adapter_method = "#{spec["adapter"]}_connection"
  6. ActiveRecord::Base.connection_handler.specified_establish_connection(pool_name, ActiveRecord::Base::ConnectionSpecification.new(spec, adapter_method))
  7. end

在模型中,定义方法pool_name:

Ruby代码  
  1. class TaskStat < ActiveRecord::Base
  2. def self.pool_name;"monitor_spider";end
  3. ...
  4. end
  5. class TaskInfo < ActiveRecord::Base
  6. def self.pool_name;"monitor_center";end
  7. ...
  8. end

这样,TaskStat就会用monitor_spider pool,TaskInfo会用monitor_center pool。同时整个应用就只有三个ConnectionPool(外加默认的ActiveRecord::Base的)

通过这样的改造之后,效果明显,现在show processlist一般只有200~300的连接数。

转载于:https://www.cnblogs.com/qinyan20/p/3643130.html

establish connection相关推荐

  1. Chrome报错:Unchecked runtime.lastError: Could not establish connection. Receiving end does not exist.

    Chrome报错:Unchecked runtime.lastError: Could not establish connection. Receiving end does not exist. ...

  2. Could not establish connection to hadoop0:10000/default: Connection refused: connect

    今天在完成Hive的安装配置后,通过java客户端连接Hive进行操作时抛了一个异常: Exception in thread "main" java.sql.SQLExcepti ...

  3. 报错:Unchecked runtime.lastError:Could not establish connection. Receiving end does not exist.

    报错:Unchecked runtime.lastError:Could not establish connection. Receiving end does not exist. 解决办法: 打 ...

  4. VSCode远程链接Could not establish connection to “hz.matpool.com”

    VS Code远程链接报错Could not establish connection to "hz-t2.matpool.com" 输出的部分内容 安装Git git for w ...

  5. VS Code远程链接报错Could not establish connection to “hz-t2.matpool.com”

    VS Code远程链接报错Could not establish connection to "hz-t2.matpool.com" 输出的部分内容 ## 解决方法1 git fo ...

  6. VScode远程连接出错 Could not establish connection. Cannot read properties of undefined (reading ‘replace‘)

    出现问题 2022.9.11 使用vscode ssh远程服务器时突然发现如下提示: Could not establish connection to "xx.xx.xx.xx" ...

  7. 【VSCode】Could not establish connection The VS Code Server failed to start的三种原因和三种解决方案

    一.sever断连 解决方案:cmd+shift+p调出Command Palette,键入Remote-SSH,选择 Kill VS code Server on Host- 使用vscode重新连 ...

  8. CLion 2021.1 WSL 2报错cannot establish connection的解决方法

    昨天 CLion 2021.1.2 版本连接 WSL 2 用的好好的重启一下电脑以后突然不能用了: 尝试过WSL2 unable to establish connection : CPP-17763 ...

  9. VSCode远程连接服务器报错:Could not establish connection to “xxxxxx”【已解决】

    假设你已经做好了如下配置和尝试 在Extensions中安装好了Remote -SSH 添加了你要访问的服务器ip地址等信息,并拥有了一个config文件(如下图) 请记住这个config文件的路径, ...

  10. Google Chrome 插件开发: 无法建立连接, 接收端不存在. Could not establish connection. Receiving end does not exist

    通过以下代码向当前页面发送 "start" 消息: chrome.tabs.query({active: true,currentWindow: true}, tabs => ...

最新文章

  1. python基础包括什么-Python基础题
  2. lua元表和元方法 《lua程序设计》 13章 读书笔记
  3. 职责链模式 php,php Chain of Responsibility 职责链模式
  4. 第2章数据库服务器的安装与卸载
  5. 江苏省对口单招计算机原理,江苏省对口单招计算机原理教案
  6. 2020人工智能应用挑战赛前瞻 | 专家委员会强大阵容,震撼发布!
  7. php -- PDO异常处理
  8. Vue前端路由~非常详细哦,不要错过
  9. 再见!公司的烂系统……
  10. 计算机网络布线需要什么材料,计算机网络综合布线的设计方法与流程
  11. NIPS2019 | 2019NIPS论文 | NeurIPS2019最新更新论文~持续更新| NIPS2019百度云下载
  12. 2022新版UI云购H5系统源码+完美运行/功能强大
  13. python求两个数的最大公约数_python中求最大公约数的三种方法
  14. 解决Proteus仿真时候提示Could not load simulator DLL错误
  15. 安卓工具类集合—— 1 时间、时间戳转换工具
  16. 巴比特 | 元宇宙每日必读:蒂芙尼宣布推出限量版 CryptoPunk 定制吊坠
  17. wordpress html5视频播放插件,WordPress插件DPlayer支持m3u8视频HTML5播放
  18. Matlab中结构体Struct使用
  19. Elasticsearch断电后启动异常(failed recovery, failure RecoveryFailedException)
  20. ESTIMATE 包 error/报错 无法匹配基因

热门文章

  1. java计算税后工资switch语句_计算个人所得税!switch语句
  2. [1096]消除ADB错误“more than one device and emulator”的方法
  3. 富爸爸穷爸爸 (全球最佳财商教育系列)——2019年04月18日15:25:56
  4. 深入解析J.U.C并发包(十五)—— Thread - Specific Storage(ThreadLocal)模式
  5. allegro更新铜皮方法和快捷键
  6. 更好用计算机怎么打,电脑输入法哪个好用(最受欢迎的7大输入法对比详情)...
  7. JefferyZhao教导我们...
  8. 陶哲轩实分析 3.1节 习题试解
  9. 解决Gmail不能正常登录的问题,并推荐几个小窍门 [转]
  10. es java 模糊查询_java使用elasticsearch进行模糊查询之must使用-项目中实际使用