#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
仕様になっています。ので設定し直します。
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.yml
にpool: 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