之前查到Rails应用中连接多个数据库的方式如下:

class Cookie < ActiveRecord::Base
establish_connection :typo
... end 

这样,在使用Cookie.find等操作的时候,就会连接到database.yml中monitor_spider配置的数据库上操作。以前一直都这么用,没发现什么不妥。最近一个项目,由于启动的进程比较多,老是碰到数据库连接池链接获取超时的错误。

通过MySQL Client用命令:show processlist; 发现数据库连接数量一直居高不下,轻轻松松就上2k+的连接。

通过读Rails框架的connection_pool.rb文件代码,发现在各模型中用establish_connection连接数据库会造成很大的问题。

文件中类ConnectionHandler的establish_connection方法代码如下:

def establish_connection(name, spec)
@connection_pools[name] = ConnectionAdapters::ConnectionPool.new(spec)
end

对应上面Cookie模型的配置,这里name的值会是Cookie。

也就是说,有10个模型中使用了establish_connection配置,@connection_pools中就会初始化10个ConnectionPool,

如果每个ConnectionPool的pool size是20,那么应用运行的时候,将需要200(10 × 20)个数据库连接。

而我的应用中有两类模型(连接到两个数据库),模型总数40+。按establish_connection的方式设置数据库连接,那么mysql的连接轻易就被消耗完了。

那要怎么处理呢?

1、配置database.yml 

development:
adapter: mysql
encoding: utf8
database: myapp
username: root
password:
host: localhost test:
adapter: sqlite3
database: db/test.sqlite3
pool: 5
timeout: 5000 production:
adapter: mysql
encoding: utf8
database: myapp
username: root
password:
host: localhost typo:
adapter: mysql
database: typo
username: root
password:
host: localhost

说明: 
1、typo是外部数据库,这是一个rails安装之后就存在的一个实例应用的库; 
2、其他的development、test、production都是缺省的主数据库,这是缺省配置; 
3、yml文件的书写方式非常严格,typo描述部分的下面各个参数必须采用tab的方式对齐,在netbeans中可以识别此格式,如果格式不对,将提示错误。

二、编写一个外部库的基础模型类 
创建external_data.rb这个模型类

class ExternalData < ActiveRecord::Base
self.abstract_class = true
establish_connection :typo
end

说明:

1、self.abstract_class = true,表示这个模型类不会与库中的任何表有关系,也就是一个抽象的类。 
2、establish_connection :typo,就是配置连接

三、编写一个具体的模型类 

创建文件Cookie.rb,内容如下:

class Cookie < ExternalData 
end

说明:

1、关键在于Cookie这个类是从刚才定义的抽象类ExternalData中继承而来,有一个好处是这个抽象类下衍生出来的各个模型类可以共用连接池,减少数据库连接的消耗。 
2、这种采用继承的方式非常方便创建其他表对应的类,不需要在模型中重复书写establish_connection :typo这样的语句。与缺省库中的模型操作起来一样,不一样的就是父类不同而已。

Rails:rails链接多个数据库【转】的更多相关文章

  1. 非链接方式访问数据库--查询的数据集用Dataset来存储。

    private void Button_Click_1(object sender, RoutedEventArgs e) { //非链接方式访问数据库, //1创建连接对象(连接字符串) using ...

  2. ADO.NET 连接方式和非链接方式访问数据库

    一.//连接方式访问数据库的主要步骤(利用DataReader对象实现数据库连接模式) 1.创建连接对象(连接字符串) SqlConnection con = new SqlConnection(Co ...

  3. MySQL的链接,查看数据库,使用数据库,查看表

    MySQL的链接,查看数据库,使用数据库,查看表 mysql> show databases; +--------------------+ | Database | +------------ ...

  4. 在ASP.NET MVC5 及 Visual Studio 2013 中为Identity账户系统配置数据库链接及Code-First数据库迁移

    在ASP.NET MVC5 及 Visual Studio 2013 中为Identity账户系统配置数据库链接及Code-First数据库迁移 最近发布的ASP.NET MVC 5 及Visual ...

  5. superset链接本地mysql数据库

    刚安装好superset的时候大家都知道是用的其自动生成的sqllite数据库,如果我们想让器链接到自己数据库,给大家分享一下我的方法,以mysql为例: 1.安装好数据库mysql: $ sudo ...

  6. 简单的PL/SQl链接远程ORACLE数据库方法

    简单的PL/SQl链接远程ORACLE数据库方法 PLSQL Developer新手使用教程 pasting

  7. 从0开始学爬虫8使用requests/pymysql和beautifulsoup4爬取维基百科词条链接并存入数据库

    从0开始学爬虫8使用requests和beautifulsoup4爬取维基百科词条链接并存入数据库 Python使用requests和beautifulsoup4爬取维基百科词条链接并存入数据库 参考 ...

  8. python基础 — 链接 Mysql 创建 数据库和创表

    重点: 1. 链接服务器的数据库 2. 创建表和格式 3. 插入多行数据 import pymysql try: host='xxx' user='xxx' passwd='xxx' db='test ...

  9. java链接并操作数据库

    链接准备 MySQL数据库驱动(连接器).mysql-connector-java-x.x.xx.jar会在MySQL安装时提供,若Mysql是默认安装路径,则连接器在:C:\Program File ...

随机推荐

  1. JS,Jquery获取屏幕的宽度和高度

    Javascript: 网页可见区域宽: document.body.clientWidth网页可见区域高: document.body.clientHeight网页可见区域宽: document.b ...

  2. How to use QToolBar and QToolButton in Qt

    http://developer.nokia.com/Community/Wiki/How_to_use_QToolBar_and_QToolButton_in_Qt How to use QTool ...

  3. vijos 1057 盖房子 dp 最大子正方形

    P1057盖房子 未递交 标签:[显示标签] 描述 永恒の灵魂最近得到了面积为n*m的一大块土地(高兴ING^_^),他想在这块土地上建造一所房子,这个房子必须是正方形的. 但是,这块土地并非十全十美 ...

  4. Python之flask总结

    一.flask      a.Flask是一个基于Python开发并且依赖jinja2模板和Werkzeug WSGI服务的一个微型框架,对于Werkzeug本质是Socket服务端,其用于接收htt ...

  5. 爬虫之MongoDB

    一.简介 MongoDB是一款强大.灵活.且易于扩展的通用型数据库 1.易用性 MongoDB是一个面向文档(document-oriented)的数据库,而不是关系型数据库. 不采用关系型主要是为了 ...

  6. 智课雅思词汇---二十、前缀syn-sym-syl是什么意思

    智课雅思词汇---二十.前缀syn-sym-syl是什么意思 一.总结 一句话总结:l,m,n是可以互换 前缀:sy-, syn-, sym-, syl- [词根含义]:共同,同时 [词根来源]:(s ...

  7. Memcache面试题

    * memcached是怎么工作的? * memcached最大的优势是什么? * memcached和MySQL的query cache相比,有什么优缺点? * memcached和服务器的loca ...

  8. MySQL 索引的知识整理

    前言:       很多面试者,在面试的时候,都会回答,”索引就相当于一本书的字典,有了他能够很快的找到数据”, 这种答案好像在读书的时候老师告诉这么说的吧.今天来全面的描述一下数据库索引的原理及优化 ...

  9. 27 python 网络基础之网络协议

    一.操作系统基础 操作系统:(Operating System,简称OS)是管理和控制计算机硬件与软件资源的计算机程序,是直接运行在“裸机”上的最基本的系统软件,任何其他软件都必须在操作系统的支持下才 ...

  10. 22 Python 模块与包

    一 模块 1 什么是模块? 常见的场景:一个模块就是一个包含了python定义和声明的文件,文件名就是模块名字加上.py的后缀. 但其实import加载的模块分为四个通用类别: 1 使用python编 ...