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**にしました。

まずはインストール

```console
$ brew install mysql
```
インストールできたらバージョンの確認

```console
$ mysql --version
mysql  Ver 8.0.12 for osx10.12 on x86_64 (Homebrew)
```
MySQLを起動します。

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

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

```console
mysql> ALTER USER 'root'@'localhost' IDENTIFIED BY 'ここにパスワードを入れるンゴ';
```
設定完了です。確認してみます。`-p`オプションでパスワードありのログインをします。

```console
$ 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`できるはずです。

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

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

##railsでのconnection_pool
このコネクションプール、APIドキュメントを読んでみると、コネクションと[スレッド](https://qiita.com/k-penguin-sato/items/1326882c400cac8c109b)の関係は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