zoukankan      html  css  js  c++  java
  • Rails:rails链接多个数据库【转】

    之前查到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这样的语句。与缺省库中的模型操作起来一样,不一样的就是父类不同而已。 

  • 相关阅读:
    Map 合并
    如何对hashmap按value值排序
    svn使用
    java中key-value数据有重复KEY如何存储
    linux 定时
    java 执行shell命令
    Java相对路径读取文件
    MySql之on duplicate key update详解
    前端学习资源整合
    Number浮点数运算详解
  • 原文地址:https://www.cnblogs.com/zs-note/p/4932342.html
Copyright © 2011-2022 走看看