Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationEventAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
8
Help us understand the problem. What are the problem?

More than 1 year has passed since last update.

Railsでコネクションプール① 初心者→中級者へのSTEP23/25

connection

はじめに

今回はたんまり書きます。もう憎きMySQLの導入から書こうかなと思ってます。テーマはconnectionです。
環境は下記のとおりです。

環境
Rails 5.1.6.1
ruby 2.3.1
mysql Ver 8.0.12
macOS 10.12.6

MySql導入

以前四苦八苦したMySQLの導入からです。バージョンは8です。5系の記事は結構あったので、あまり記事のない最新の8にしました。

まずはインストール

$ brew install mysql

インストールできたらバージョンの確認

$ mysql --version
mysql  Ver 8.0.12 for osx10.12 on x86_64 (Homebrew)

MySQLを起動します。

$ mysql.server start
Starting MySQL
. SUCCESS! 

この段階で起動できない方はエラーメッセージでググれば色々記事が出てくるので参考にしてください。
問題がなければrootユーザーでMySQLにログインします。
この時、状況によってパスワードの有無が違うようです。パスワードがある場合はログにランダム生成されたパスワードが出るらしいですが、僕の場合はパスワードが生成されませんでした。のでパスワード無しでログインして、きちんとrootユーザにパスワードを設定します。

$ mysql -u root --skip-password

-uオプションでMySQLに接続するユーザーをrootに指定し、--skip-passwordでパスワードをスキップしています。
ではパスワードを設定します。

mysql> ALTER USER 'root'@'localhost' IDENTIFIED BY 'ここにパスワードを入れるンゴ';

設定完了です。確認してみます。-pオプションでパスワードありのログインをします。

$ mysql -u root -p
Enter password: 
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 14
Server version: 8.0.12 Homebrew

Copyright (c) 2000, 2018, Oracle and/or its affiliates. All rights reserved.

無事ログインできました。では次はRailsでMySQLを使ってみましょう。

RailsでMySQLを扱う

まずはgemをインストールします。

gem 'mysql2'

bundle installしましょう。
そしたら次にデータベースの設定ファイルをいじります。rails newでアプリを作った時になんのオプションもつけてなければ、今この設定ファイルはSQLite仕様になっています。ので設定し直します。

config/database.yml
development:
  <<: *default
  adapter: mysql2
  reconnect: false
  database: sample_sql_development
  pool: 5
  username: root
  password: さっき設定したパスワード
  host: localhost

ひとまずdevelopmentのところだけいじります。

設定
adapter 使用するデータベース種類
encoding 文字コード
reconnect 再接続するかどうか
database データベース名
pool コネクションプーリングで使用するコネクションの上限
username ユーザー名(今回はroot)
password パスワード
host MySQLが動作しているホスト名

これで設定が完了したのでrails db:createできるはずです。

$ rails db:create
Created database 'sample_sql_development'

ンゴンゴンゴ〜〜。できました。先日四苦八苦してたのは既存のアプリにMySQLを使わせようとしたから多分どこか不調を起こしていたのでしょう。新規にrails newでアプリ立ち上げて0からやり直したら一発でできました。
リベンジは済んだとして次からが本題です。

コネクションプールとは

簡単いうと、DBに接続状態を維持したコネクションをいくつか用意しとき、それを再利用することによってDBへの接続を短縮することです。
上述のconfig/database.ymlpool: 5とありますよね。つまり、これは5つのコネクションをプールするという設定になります。DBに接続する時はこのコネクションを使い回します。もちろん5つ使われている時は空くまで待たされることになります。

railsでのconnection_pool

このコネクションプール、APIドキュメントを読んでみると、コネクションとスレッドの関係は1対1だそうです。この関係はクエリを発行した段階で作られます。

次回に続く....

参考にしたの

MySQL用のデータベース設定ファイル(database.yml)
https://www.javadrive.jp/rails/model/index2.html

2.10.4 Securing the Initial MySQL Account
https://dev.mysql.com/doc/refman/8.0/en/default-privileges.html

ActiveRecord::ConnectionAdapters::ConnectionPool < Object
https://api.rubyonrails.org/classes/ActiveRecord/ConnectionAdapters/ConnectionPool.html

【Ruby】Thread(スレッド)を理解する
https://qiita.com/k-penguin-sato/items/1326882c400cac8c109b

Railsでマルチスレッドを使う時はDB_Connectionの最大数に注意
https://qiita.com/SoarTec-lab/items/5bc754036e62b76ddcfe

Rails4.2のコネクションプールの実装を理解する
https://hackerslab.aktsk.jp/technology/rails4_connection_pooling/

ActiveRecordのestablish_connectionを読む
http://kotaroito.hatenablog.com/entry/2015/06/23/105045

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
8
Help us understand the problem. What are the problem?