2019/04/06

WordPressのブログを引っ越した

WordPressでブログを書いていたのだが、自分で管理するのがしんどくなってきていた。

  • WordPressの更新は、管理画面で行えるから、いい。
  • プラグインの更新は、管理画面で行えるから、まあ、いい。
  • テーマの更新は、頻繁に行うものでもないから、まぁ、いい。
  • WordPressを動かすために必要なPHPを5から7にバージョンアップ
  • サーバのUpdate
となってくると、正直面倒くさい。こういうことは、お仕事だけで十分だ。

というわけで、移転という視点で、「WordPressが使える」とうたっている有料のサーバーを探してみた。

カラフルボックスに移転した

WordPressのサーバー比較とかで検索して出てくるのは、「新たに始める」ことを暗黙の前提にしているブログがほとんどだ。
それでも、以前は「DNSに登録するアドレスを更新すればそのうち切り替わる」から、新旧2つのサーバでしばらく動かしておけばよかった。
でも、最近はhttpsを使うようになっている。切り替わってからSSLの証明書を入手する必要があるので、以前よりも引越しにかかる時間は増えている。
それに、無料のSSLを使うためにはDNSのサーバを切り替える必要があると読み取れるサービスもいくつかあった。

こういった点に注意して

  • 無料のSSLが使える。証明書の取得処理は、好きな時に手動で開始できる。
  • 無料のSSLを使う場合でも、DNSのサーバを切り替える必要がない
ということが読み取れた、ColorfulBox を使うことにした。
  • 値段は飛び抜けて高いということもない
  • サービスのスペックが他社と大きく違うこともない
と、マイナスポイントも特になかった。

引越しサービスは使わなかった

カラフルボックスにはWordPressの引越しを行なってくれるサービスがある。「利用してみた」というブログも見かけたが、今回は自分で行なった。
といっても、手順はカラフルボックスのヘルプに書いてある。
WordPressのサイトを他サーバーから移行する方法 – ColorfulBox(カラフルボックス) サポートサイト
「プラグインを使わない場合」の手順でDBとファイル一式をアップロードし、
DNSの登録アドレスの変更→管理画面でSSL証明書の手続き
という順番で、引越し完了。

WordPressサービス比較

今回、比較していてためになったのが障害情報のページ。よく読んでいると、システム構成が垣間見えて面白かった。

比較したサービス

サービス名申し込みページコメント
エックスサーバー オススメしている人が多い。ここのサーバーを使ってWordPressのブログサービスをやっている業者があるっぽい。
wpX エックスサーバーだとお隣さんが人気サイトの場合に影響受ける印象だけど、こっちだと大丈夫そう。初期費用0円というのも、手軽に始められる。
スターサーバー なかなかお安い。
mixHost オススメしている人が多い。エックスサーバーと同じく、使っている業者がいる感じ。
さくらのレンタルサーバー レンタルサーバー以外もやっている。いろいろやれるさくらのVPS は使用中。
KagoyaのWordPress専用サーバー KUSANAGI という超高速WordPressが使えるのがウリ。ただ、一部の機能が使えないという話がある。
JetBoy無料SSLを使うには、DNS Serverを切り替える必要があるように読み取れた。
ConoHa WING ちょっと高い。といっても、エックスサーバーとそれほど違わないか。
カラフルボックス WordPressの引越しメニューあり。東京と大阪でバックアップを持っている。

引越しはプロに任せる

「Linuxの勉強だ!」という気持ちでやれる人ならともかく、「ブログ書きたい!システムのことはやりたくない!」って人は引越しサービスを使った方がいい。ブログにアクセスできないということはアフィリエイターにとっては機会損失に繋がるのだから、プロのノウハウを借りて短時間で済ませるようにすべきだと思う。



2019/03/17

flyway を3.xから5.xにアップグレードするときは注意!

Spring Bootをアップグレードするとflywayもメジャーアップデートされる

Spring Boot 1.x EOL Aug 1st 2019 とあるように、Spring Boot 1.x のEOLは2019/8 なので、2.xにアップグレードする必要がある。

Spring Boot 2.0 Migration Guide · spring-projects/spring-boot Wiki · GitHub をみていたところ、Flywayを使っている場合、テーブル構造が変わるので一旦flyway 4.2.0 + Spring Boot 1.5.xの構成にするようにとあった。「じゃぁ」と始める前に、今どうなっているかをちゃんと確認しておこう。方法は2つある。いずれにせよ事前調査は重要だ。

flywayのversionをログで確認

ログを見れば起動時にflywayのVersionも表示されている。だけど、長い間動かしてきて、かつ、定期的にログを退避していると、起動時のログを見つけるのが大変だったりする。

flywayのテーブル構造でversion確認

変わるというテーブル構造を直接確認する。ログにある起動時のメッセージだと、見落とす可能性も0ではない。が、動いているプログラムが使っているテーブルの構造であれば、確実だ。

対象は、schema_versionテーブル。3.xのtable定義(構造)を見てみる。

mysql> desc schema_version;
+----------------+---------------+------+-----+-------------------+-------+
| Field          | Type          | Null | Key | Default           | Extra |
+----------------+---------------+------+-----+-------------------+-------+
| version_rank   | int(11)       | NO   | MUL | NULL              |       |
| installed_rank | int(11)       | NO   | MUL | NULL              |       |
| version        | varchar(50)   | NO   | PRI | NULL              |       |
| description    | varchar(200)  | NO   |     | NULL              |       |
| type           | varchar(20)   | NO   |     | NULL              |       |
| script         | varchar(1000) | NO   |     | NULL              |       |
| checksum       | int(11)       | YES  |     | NULL              |       |
| installed_by   | varchar(100)  | NO   |     | NULL              |       |
| installed_on   | timestamp     | NO   |     | CURRENT_TIMESTAMP |       |
| execution_time | int(11)       | NO   |     | NULL              |       |
| success        | tinyint(1)    | NO   | MUL | NULL              |       |
+----------------+---------------+------+-----+-------------------+-------+
11 rows in set (0.00 sec)

mysql>

4.2.0以降の定義は、
mysql> desc schema_version;
+----------------+---------------+------+-----+-------------------+-------+
| Field          | Type          | Null | Key | Default           | Extra |
+----------------+---------------+------+-----+-------------------+-------+
| installed_rank | int(11)       | NO   | PRI | NULL              |       |
| version        | varchar(50)   | YES  |     | NULL              |       |
| description    | varchar(200)  | NO   |     | NULL              |       |
| type           | varchar(20)   | NO   |     | NULL              |       |
| script         | varchar(1000) | NO   |     | NULL              |       |
| checksum       | int(11)       | YES  |     | NULL              |       |
| installed_by   | varchar(100)  | NO   |     | NULL              |       |
| installed_on   | timestamp     | NO   |     | CURRENT_TIMESTAMP |       |
| execution_time | int(11)       | NO   |     | NULL              |       |
| success        | tinyint(1)    | NO   | MUL | NULL              |       |
+----------------+---------------+------+-----+-------------------+-------+
10 rows in set (0.00 sec)

mysql>
version_rankというカラムがあるかないかで判断してよさそうだ。

もう1つの注意は4.2.0からのアップグレード方法

migration guideには書いていないのだが、flywayの管理テーブルが変わる。[Spring Boot] Flyway 3系で作ったテーブルを Flyway 5系にアップデートする方法 | DevelopersIO で触れられているのだが、flyway 5.xではdefaultの管理テーブルは変更されていて、なければschema_versionテーブルを使うという動きになっている。

だから気にすることはないといえばないのだが、flyway 6.xでは、この、なければschema_versionテーブルを使うという動きがなくなる。

flyway.table=schema_version
と設定しておくと、管理テーブルとしてschema_versionテーブルを使うようになるので、Spring Boot 2.xにするタイミングで設定しておくのが安全だ。

アップグレードは旬の作業

みんながアップグレードしているときは、話題にもなるし、質問に答えてくれる人も多い。が、いつまでもアップグレードを先送りにしていると、みんな忘れてしまう(あるいは、なかったことにしてしまう)し、アップグレードのためのライブラリーやツールがなくなってしまうこともある。タイミングを逃さずに行わなければならない作業の1つだろう。



2019/01/08

iPhone8購入

iPhone 8購入

以前購入したモトローラ Moto G5sがポケモンGoをやるには遅くてまいっていたので、Appleの初売りと Rebates(リーベイツ)のポイントアップが重なったタイミングで購入。

iPhone8

開封の儀

発売されてずいぶん経っているモデルなので、視点を変えて、宅配便で送られてきたときの箱から取り出す様子。

宅配便 iPhone

バリバリやらなくても開く、スマートな箱に入っていた。

移行は楽チン

以前使っていたiPhone SEから設定を引き継いだのだが、楽チン。iTunesで取っていたbackupから戻した後、iPhone SEとiPhone 8を並べて放置。これで設定が引き継がれるのだから、便利なものだ。

iPhone 設定 移行 引継ぎ

ケースと保護フィルム

ケースはいつものTPU。保護フィルムはiPhone 8/7/6s/6用というのを買ったら、ちょっと小さかった。

moto G5sよりも小さい

少し小さくなった。

moto G5s iPhone 8 比較 大きさ

iPhone SEの大きさで、全面液晶だといいんだけど。

古いモデルとはいえ、ポケモンGoもサクサク動く。とはいえ、アプリはどんどん重たくなっていくので、iPhone 8をいつまで使い続けられるだろうか。



2019/01/05

2019年年賀状


今年もよろしくお願いします。


2018/12/31

SREに思う

話題の職種SRE

今年はSREが話題になった。SRE本が出て広く読まれたということもあるが、バズワードになることなく実体が伴っているということは、SRE Advent Calendar 2018 - Qiitaの各記事を見ても明らかだろう。

ただ、SREと呼ばれる役職はやることが多岐にわたるため、「SREの部隊を作る」と言われた時の不安も多い。

運用エンジニアを補充するための方便

SRE本第1章には、システムの運用をソフトウェアエンジニアが行うようにしたとある。運用を行うのだからと、従来の運用(devとopsに分断した状態のops)のミッションのまま、「SRE」と偽って人を集めるところがでてくると、不幸だ。
第5章に、「運用業務を、各人の作業時間の50%以下に抑えるという目標」とある。つまり、SREチームは運用チームの単純な言い換えではないのだ。運用業務以外のエンジニアリング、つまり、ツールの作成や信頼性のための機能の追加、モニタリングのセットアップなどの活動が、業務時間の半分を超えるような職種だ。「問題が発生したから対処する」という受け身の運用チームとは、性格が全く異なっている。
「攻めの運用チーム」と仕事をしたという記憶が残っていないので、SREは運用チームとは異なった職種であるとは言い切れないのだが、少なくとも、「受け身の運用チーム」とは異なった職種であろう。

class SRE implements DevOps

悩んでいた一文ではあったのだが、Advent Calender 24日目のSRE風のインフラエンジニアにならないために - Work Recordsを読んで納得。確かに、高速にリリースできれば問題が起きた時も ロールバックする/修正版をリリースする どちらの手段も有効だろう。

しかし、devが「高速にリリースできる」ように作っていないと無理な話だし、opsにはそれを実行するための腕が必要になってくる。devとopsが顧客へのサービス提供という点で協力し合う文化が醸成されていなければ、難しい話だ。

  • 「運用回避」のまま放置されている障害
  • devには公開されていない本番環境のリソース使用状況
  • リリースに立ち会わないdevチーム
  • devにエスカレーションされない障害通知のチケット
うまく協力し合えていないのではないか?という事象は、いろいろ考えられる。協力の文化がないところには、SREは時期尚早ではないか?

監視

SRE本第3章、エラーバジェットの話。客観的なメトリクスを定義し、そこからSLOとエラーバジェットを規定する。devとopsの対立を、「エラーバジェット」を導入して解決する。ここで重要になってくるのが、定義したメトリクスの監視。
自社のサービスの監視項目を見てもすっきりしなかったので、考え直してみた。

  • インフラレイヤーでの監視
  • サービスレイヤーでの監視
  • devが気にする項目の監視
インフラレイヤーでの監視は、AWSのCloudWatchにデフォルトで出てくる項目だったり、Mackerel(マカレル): 新世代のサーバ管理・監視サービスのagentがデフォルトで監視している項目である。「サーバ監視」と言っても良いかもしれない。
サービスレイヤーでの監視は、インフラレイヤーよりももう少し大きな視点から見た監視。極端なことを言えば、サーバが1台止まっていても、ちゃんと可用性を確保する構成になっていて提供サービスに影響がなければ「問題なし」と判断する。
devが気にする項目の監視は、APMと呼ばれる分野かもしれない。サーバが動いていても、リクエストに対する処理の1つがエラーになったらNGと判断する。
この3つに分類してみると、サービスレイヤーでの監視を行うサービス(商品)は少ない気がする。URL外形監視をおこなう - Mackerel ヘルプなどのURL監視や、LoadBalancerでのレスポンスタイムやHTTP Statusの監視くらいか。

ただ、[SRE Advent Calendar] 監視システムの特徴から考える監視設計のポイント - かつひささんの日記にあるように、SREの成果を見るには信頼性を計測する必要があるので、そう簡単な話では済まないはずだ。サービスにするほどのニーズが集まらない(分散してしまう)とか、そもそもSREはプログラムを書ける人だから自分たちで作ってしまっているとか、そういった事情があるのだろう。
監視の目的がサーバ監視とは異なるから、従来の運用チームが使っていた仕組みではうまくいかない可能性も考えておく必要がある。

まとめ

信頼性の問題は、SREという役を作れば解決するものではない。そういった役割を作れるだけの文化が醸成されていないかぎり、そして、役を作れば解決するという考えを改めない限り、どんなことをやっても解決しないだろう。



2018/09/29

PRIMERGY TX1310 M1購入

FUJITSUのサーバ購入

お家サーバが動かなくなってもう10ヶ月。いい加減なんとかしようと探してみたら、NTT-X Storeで安く出ていたので購入。

1uのラックマウント型ケースにマザーボードを買ってきて組み立てていたけど、3,4年で動かなくなる。以前もサーバーのマザーボード交換 を行ったけど、ケースに収まるものを見つけるのが大変だった。

開封の儀

FUJITSUのダンボール。

キーボードやアクセサリが上の段。
重いサーバ本体は下の段。
ドライバー無しでケースを開けられるのが嬉しい。
左が底面、下が前面。底面に2台、隠しベイに2台HDDが取り付けられる。5インチベイにも取り付けられそうだけど、HDDのマウンターはついていない様子。

ディスクを移植してサーバ復活

ディスクを入れ替えてスイッチオン。無事にFreeBSDが立ち上がり、Network I/Fも認識されて復活。
と思ったら、USBキーボードが認識されない。/boot/loader.conf でehciをロードするよう設定して、解決。

Copyright (c) 1992-2013 The FreeBSD Project.
Copyright (c) 1979, 1980, 1983, 1986, 1988, 1989, 1991, 1992, 1993, 1994
        The Regents of the University of California. All rights reserved.
FreeBSD is a registered trademark of The FreeBSD Foundation.
FreeBSD 8.4-RELEASE-p23 #3: Sat Jan 31 05:41:37 JST 2015
    root@dorothea.home.group.jp:/usr/obj/usr/src/sys/dorothea i386
gcc version 4.2.1 20070831 patched [FreeBSD]
Timecounter "i8254" frequency 1193182 Hz quality 0
CPU: Intel(R) Pentium(R) CPU G3420 @ 3.20GHz (3192.63-MHz 686-class CPU)

  Origin = "GenuineIntel"  Id = 0x306c3  Family = 6  Model = 3c  Stepping = 3
  Features=0xbfebfbff<FPU,VME,DE,PSE,TSC,MSR,PAE,MCE,CX8,APIC,SEP,MTRR,PGE,MCA,CMOV,PAT,PSE36,CLFLUSH,DTS,ACPI,MMX,FXSR,SSE,SSE2,SS,HTT,TM,PBE>
  Features2=0x45daebbf<SSE3,PCLMULQDQ,DTES64,MON,DS_CPL,VMX,EST,TM2,SSSE3,<b11>,CX16,xTPR,PDCM,PCID,SSE4.1,SSE4.2,MOVBE,POPCNT,TSCDLT,XSAVE,RDRAND>
  AMD Features=0x2c100000<NX,Page1GB,RDTSCP,LM>
  AMD Features2=0x21<LAHF,ABM>
  TSC: P-state invariant
real memory  = 4294967296 (4096 MB)
avail memory = 3578269696 (3412 MB)
ACPI APIC Table: <FTS    D3219-A1>
FreeBSD/SMP: Multiprocessor System Detected: 2 CPUs
FreeBSD/SMP: 1 package(s) x 2 core(s)
 cpu0 (BSP): APIC ID:  0
 cpu1 (AP): APIC ID:  2
ACPI Warning: FADT (revision 5) is longer than ACPI 2.0 version, truncating length 268 to 244 (20101013/tbfadt-392)
ioapic0 <Version 2.0> irqs 0-23 on motherboard
kbd1 at kbdmux0
cryptosoft0: <software crypto> on motherboard
acpi0: <FTS D3219-A1> on motherboard
acpi0: [ITHREAD]
acpi0: Power Button (fixed)
acpi0: reservation of 67, 1 (4) failed
Timecounter "ACPI-fast" frequency 3579545 Hz quality 1000
acpi_timer0: <24-bit timer at 3.579545MHz> port 0x1808-0x180b on acpi0
cpu0: <ACPI CPU> on acpi0
cpu1: <ACPI CPU> on acpi0
pcib0: <ACPI Host-PCI bridge> port 0xcf8-0xcff on acpi0
pci0: <ACPI PCI bus> on pcib0
vgapci0: <VGA-compatible display> port 0xf000-0xf03f mem 0xf7800000-0xf7bfffff,0xe0000000-0xefffffff irq 16 at device 2.0 on pci0
pci0: <serial bus, USB> at device 20.0 (no driver attached)
em0: <Intel(R) PRO/1000 Network Connection 7.3.7> port 0xf080-0xf09f mem 0xf7d00000-0xf7d1ffff,0xf7d35000-0xf7d35fff irq 20 at device 25.0 on pci0
em0: Using an MSI interrupt
em0: [FILTER]
em0: Ethernet address: 90:1b:0e:xx:xx:xx
ehci0: <EHCI (generic) USB 2.0 controller> mem 0xf7d34000-0xf7d343ff irq 16 at device 26.0 on pci0
ehci0: [ITHREAD]
usbus0: EHCI version 1.0
usbus0 on ehci0
pcib1: <ACPI PCI-PCI bridge> irq 16 at device 28.0 on pci0
pci1: <ACPI PCI bus> on pcib1
pcib2: <ACPI PCI-PCI bridge> irq 18 at device 28.2 on pci0
pci2: <ACPI PCI bus> on pcib2
pci2: <network, ethernet> at device 0.0 (no driver attached)
ehci1: <EHCI (generic) USB 2.0 controller> mem 0xf7d33000-0xf7d333ff irq 23 at device 29.0 on pci0
ehci1: [ITHREAD]
usbus1: EHCI version 1.0
usbus1 on ehci1
isab0: <PCI-ISA bridge> at device 31.0 on pci0
isa0: <ISA bus> on isab0
atapci0: <Intel Lynx Point SATA300 controller> port 0xf0d0-0xf0d7,0xf0c0-0xf0c3,0xf0b0-0xf0b7,0xf0a0-0xf0a3,0xf060-0xf07f mem 0xf7d32000-0xf7d327ff irq 19 at device 31.2 on pci0
atapci0: [ITHREAD]
atapci0: AHCI called from vendor specific driver
atapci0: AHCI v1.30 controller with 6 6Gbps ports, PM not supported
ata2: <ATA channel> at channel 0 on atapci0
ata2: [ITHREAD]
ata3: <ATA channel> at channel 1 on atapci0
ata3: [ITHREAD]
ata4: <ATA channel> at channel 4 on atapci0
ata4: [ITHREAD]
pci0: <serial bus, SMBus> at device 31.3 (no driver attached)
pci0: <dasp> at device 31.6 (no driver attached)
acpi_button0: <Power Button> on acpi0
acpi_tz0: <Thermal Zone> on acpi0
acpi_tz1: <Thermal Zone> on acpi0
acpi_hpet0: <High Precision Event Timer> iomem 0xfed00000-0xfed003ff on acpi0
Timecounter "HPET" frequency 14318180 Hz quality 900
atrtc0: <AT realtime clock> port 0x70-0x77 irq 8 on acpi0
atrtc0: Warning: Couldn't map I/O.
uart0: <16550 or compatible> port 0x3f8-0x3ff irq 4 flags 0x10 on acpi0
uart0: [FILTER]
uart0: console (115200,n,8,1)
pmtimer0 on isa0
orm0: <ISA Option ROM> at iomem 0xc0000-0xcffff pnpid ORM0000 on isa0
sc0: <System console> at flags 0x100 on isa0
sc0: VGA <16 virtual consoles, flags=0x300>
vga0: <Generic ISA VGA> at port 0x3c0-0x3df iomem 0xa0000-0xbffff on isa0
ata0: <ATA channel> at port 0x1f0-0x1f7,0x3f6 irq 14 on isa0
ata0: [ITHREAD]
ata1: <ATA channel> at port 0x170-0x177,0x376 irq 15 on isa0
ata1: [ITHREAD]
coretemp0: <CPU On-Die Thermal Sensors> on cpu0
est0: <Enhanced SpeedStep Frequency Control> on cpu0
p4tcc0: <CPU Frequency Thermal Control> on cpu0
coretemp1: <CPU On-Die Thermal Sensors> on cpu1
est1: <Enhanced SpeedStep Frequency Control> on cpu1
p4tcc1: <CPU Frequency Thermal Control> on cpu1
Timecounters tick every 1.000 msec
IPsec: Initialized Security Association Processing.
ipfw2 (+ipv6) initialized, divert loadable, nat loadable, rule-based forwarding disabled, default to deny, logging disabled
usbus0: 480Mbps High Speed USB v2.0
usbus1: 480Mbps High Speed USB v2.0
ad4: 953869MB <WDC WD10EZEX-00RKKA0 80.00A80> at ata2-master UDMA100 SATA 6Gb/s
ad6: 1907729MB <ST2000DL003 9VT166 CC32> at ata3-master UDMA100 SATA 6Gb/s
ugen0.1: <Intel> at usbus0
uhub0: <Intel EHCI root HUB, class 9/0, rev 2.00/1.00, addr 1> on usbus0
ugen1.1: <Intel> at usbus1
uhub1: <Intel EHCI root HUB, class 9/0, rev 2.00/1.00, addr 1> on usbus1
SMP: AP CPU #1 Launched!
Root mount waiting for: usbus1 usbus0
uhub0: 2 ports with 2 removable, self powered
uhub1: 2 ports with 2 removable, self powered
Root mount waiting for: usbus1 usbus0
ugen0.2: <vendor 0x8087> at usbus0
uhub2: <vendor 0x8087 product 0x8008, class 9/0, rev 2.00/0.04, addr 2> on usbus0
ugen1.2: <vendor 0x8087> at usbus1
uhub3: <vendor 0x8087 product 0x8000, class 9/0, rev 2.00/0.04, addr 2> on usbus1
uhub2: 6 ports with 6 removable, self powered
Root mount waiting for: usbus1 usbus0
uhub3: 8 ports with 8 removable, self powered
ugen0.3: <American Power Conversion> at usbus0
Trying to mount root from ufs:/dev/ad4s1a
fuse4bsd: version 0.3.9-pre1, FUSE ABI 7.19


2018/08/15

Spring BootでJDBCの設定を確認する

JDBCの設定は難しい

なかなか避けて通れないDB。JavaでDBを使うなんてよくあることだし、ググれば簡単かと思いきや、まともに使うための設定が書いてあるページにたどり着くのは困難。サンプル通りに作ったのに、1日経ったらエラーで止まっているなんてのはよくある話。

地雷が何箇所にもあるので、トラブルシューティングに従ってやってみたところで、原因が違えば何の効果もない。が、意図した通りに設定されているということに確証が持てなければ、何をやっても無駄だ。というわけで、設定を確認する方法をまとめてみる。

Tomcat DBCPを設定する

JDBCというか、Connection Pooling。Javaなら普通Poolingするでしょうから、Spring Boot + Tomcat DBCP + MySQLのパターンに絞ってみる。

Tomcat DBCP(Tomcat JDBC Pool)については、Commons DBCPを超えるTomcat JDBC Poolとは (1/2):Tomcat 7の新機能で何ができるようになるのか?(番外編) - @ITがわかりやすい。

Spring Boot は Tomcat DBCPをサポートしているので、設定でうまくやれる。はずなのだが、Spring Bootのバージョンによって設定パラメータ名が変わっているので、どのバージョンについて話しているのかを確認しないと、悩むことになる。

MySQLのtime out系はよく見かけるトラブル。

  • Lost connection to server during query
  • MySQL server has gone away
といったものが、よく食らうエラー。

time outに関係するパラメータをうまく設定すれば解決できるのだが、Spring Bootだと、パラメータ名何だったっけ?ということになる。特に、別々のDB Serverに同時に接続できるよう、パラメータ名を変更した場合はわからなくなりがち。

設定内容を表示させる

設定内容をログに出すなり、APIのレスポンスとして返すようにするなりすれば、確認できる。というのが、Spring Boot configuration for Tomcat’s pooling data source | The Art of Codeに書かれている。具体的なコードが書かれているので、英語アレルギーでもコードだけ見ればわかるだろう。
DataSourceオブジェクトを作って、そのプロパティを表示するコードなのだが、どんな設定がされているのか、このアプローチなら確かに確認できる。

タイムアウトに対処する設定

ググるとtestOnBorrowをセットすればよいとかvalidityQueryをセットしろとか見つかるが、不十分な設定を書いている記事も多い。まだブラウザで開いていたページは

といったところ。

ネットワークが絡んでくるのでシステム構成の違いによる影響が大きく、一般化してまとめるのが難しい、というか、具体的でなくなってしまうのかな。ただ、「使う前or定期的に DBにクエリーを投げて、接続が使える状態かどうか確認する」というアプローチなので、それを実現するための設定を行っていくというのが解決方法になる。