質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

Play Framework 2

Play Framework 2はPlayのメジャーバージョンです。現代の web アプリケーション開発に必要なコンポーネント及び API を統合した生産性の高い Java と Scala の web アプリケーションフレームワークです。

Q&A

解決済

2回答

5859閲覧

PlayframeworkでのDB接続

Nitta

総合スコア96

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

Play Framework 2

Play Framework 2はPlayのメジャーバージョンです。現代の web アプリケーション開発に必要なコンポーネント及び API を統合した生産性の高い Java と Scala の web アプリケーションフレームワークです。

0グッド

0クリップ

投稿2019/01/16 02:48

編集2019/01/21 06:39

お世話になってます。
今、PlayでMydsqlに接続したいのですが、
うまくいきません。

設定は間違ってないかなと思うんですが、
何が悪いのでしょうか?
お分りの方居られましたら、ご教示下さい。
宜しくお願い致します。
本当に困ってます。助けて下さい。

試したこと
default.driverClassName = com.mysql.jdbc.Driver
で記入したが駄目。

●$activator libraryDependencies

[info] List(org.scala-lang:scala-library:2.11.7, com.typesafe.play:play-enhancer:1.1.0, com.typesafe.play:twirl-api:1.1.1, com.typesafe.play:play-ebean:3.0.2, com.typesafe.play:play-server:2.5.10, com.typesafe.play:play-test:2.5.10:test, com.typesafe.play:play-omnidoc:2.5.10:docs, com.typesafe.play:play-java:2.5.10, com.typesafe.play:play-netty-server:2.5.10, com.typesafe.play:play-logback:2.5.10, com.typesafe.play:play-java-jdbc:2.5.10, com.typesafe.play:play-cache:2.5.10, com.typesafe.play:play-java-ws:2.5.10, mysql:mysql-connector-java:5.1.36, mysql:mysql-connector-java:5.1.36)

●build.sbt

libraryDependencies ++= Seq( javaJdbc, cache, javaWs,  "mysql" % "mysql-connector-java" % "5.1.36" )

●application.conf

play.db{ (中略) config="db" default="default" (中略) } db{  (中略)  default.driver = com.mysql.jdbc.Driver ebean.default=["models.*"] default.username = root default.password = "nfgwe4706" default.schema = "sample_db" default.port = "3306" default.jdbcUrl = "jdbc:mysql://localhost/sample_db"  (中略) }

●エラー内容

play.api.Configuration$$anon$1: Configuration error[Cannot connect to database [default]] at play.api.Configuration$.configError(Configuration.scala:154) at play.api.Configuration.reportError(Configuration.scala:806) at play.api.db.DefaultDBApi$$anonfun$connect$1.apply(DefaultDBApi.scala:48) at play.api.db.DefaultDBApi$$anonfun$connect$1.apply(DefaultDBApi.scala:42) at scala.collection.immutable.List.foreach(List.scala:381) at play.api.db.DefaultDBApi.connect(DefaultDBApi.scala:42) at play.api.db.DBApiProvider.get$lzycompute(DBModule.scala:72) at play.api.db.DBApiProvider.get(DBModule.scala:62) at play.api.db.DBApiProvider.get(DBModule.scala:58) at com.google.inject.internal.ProviderInternalFactory.provision(ProviderInternalFactory.java:81) Caused by: play.api.Configuration$$anon$1: Configuration error[jdbcUrl is required with driverClassName.] at play.api.Configuration$.configError(Configuration.scala:154) at play.api.PlayConfig.reportError(Configuration.scala:996) at play.api.db.HikariCPConnectionPool.create(HikariCPModule.scala:70) at play.api.db.PooledDatabase.createDataSource(Databases.scala:199) at play.api.db.DefaultDatabase.dataSource$lzycompute(Databases.scala:123) at play.api.db.DefaultDatabase.dataSource(Databases.scala:121) at play.api.db.DefaultDatabase.getConnection(Databases.scala:142) at play.api.db.DefaultDatabase.getConnection(Databases.scala:138) at play.api.db.DefaultDBApi$$anonfun$connect$1.apply(DefaultDBApi.scala:44) at play.api.db.DefaultDBApi$$anonfun$connect$1.apply(DefaultDBApi.scala:42) Caused by: java.lang.IllegalArgumentException: jdbcUrl is required with driverClassName. at com.zaxxer.hikari.HikariConfig.validate(HikariConfig.java:782) at play.api.db.HikariCPConfig.toHikariConfig(HikariCPModule.scala:141) at play.api.db.HikariCPConnectionPool$$anonfun$1.apply(HikariCPModule.scala:57) at play.api.db.HikariCPConnectionPool$$anonfun$1.apply(HikariCPModule.scala:54) at scala.util.Try$.apply(Try.scala:192) at play.api.db.HikariCPConnectionPool.create(HikariCPModule.scala:54) at play.api.db.PooledDatabase.createDataSource(Databases.scala:199) at play.api.db.DefaultDatabase.dataSource$lzycompute(Databases.scala:123) at play.api.db.DefaultDatabase.dataSource(Databases.scala:121) at play.api.db.DefaultDatabase.getConnection(Databases.scala:142)

●エラー内容2

play.api.Configuration$$anon$1: Configuration error[Cannot connect to database [default]] at play.api.Configuration$.configError(Configuration.scala:154) at play.api.Configuration.reportError(Configuration.scala:806) at play.api.db.DefaultDBApi$$anonfun$connect$1.apply(DefaultDBApi.scala:48) at play.api.db.DefaultDBApi$$anonfun$connect$1.apply(DefaultDBApi.scala:42) at scala.collection.immutable.List.foreach(List.scala:381) at play.api.db.DefaultDBApi.connect(DefaultDBApi.scala:42) at play.api.db.DBApiProvider.get$lzycompute(DBModule.scala:72) at play.api.db.DBApiProvider.get(DBModule.scala:62) at play.api.db.DBApiProvider.get(DBModule.scala:58) at com.google.inject.internal.ProviderInternalFactory.provision(ProviderInternalFactory.java:81) Caused by: play.api.Configuration$$anon$1: Configuration error[jdbcUrl is required with driverClassName.] at play.api.Configuration$.configError(Configuration.scala:154) at play.api.PlayConfig.reportError(Configuration.scala:996) at play.api.db.HikariCPConnectionPool.create(HikariCPModule.scala:70) at play.api.db.PooledDatabase.createDataSource(Databases.scala:199) at play.api.db.DefaultDatabase.dataSource$lzycompute(Databases.scala:123) at play.api.db.DefaultDatabase.dataSource(Databases.scala:121) at play.api.db.DefaultDatabase.getConnection(Databases.scala:142) at play.api.db.DefaultDatabase.getConnection(Databases.scala:138) at play.api.db.DefaultDBApi$$anonfun$connect$1.apply(DefaultDBApi.scala:44) at play.api.db.DefaultDBApi$$anonfun$connect$1.apply(DefaultDBApi.scala:42) Caused by: java.lang.IllegalArgumentException: jdbcUrl is required with driverClassName. at com.zaxxer.hikari.HikariConfig.validate(HikariConfig.java:893) at play.api.db.HikariCPConfig.toHikariConfig(HikariCPModule.scala:141) at play.api.db.HikariCPConnectionPool$$anonfun$1.apply(HikariCPModule.scala:57) at play.api.db.HikariCPConnectionPool$$anonfun$1.apply(HikariCPModule.scala:54) at scala.util.Try$.apply(Try.scala:192) at play.api.db.HikariCPConnectionPool.create(HikariCPModule.scala:54) at play.api.db.PooledDatabase.createDataSource(Databases.scala:199) at play.api.db.DefaultDatabase.dataSource$lzycompute(Databases.scala:123) at play.api.db.DefaultDatabase.dataSource(Databases.scala:121) at play.api.db.DefaultDatabase.getConnection(Databases.scala:142)

●application.conf(2018.01.21)

akka { } play.crypto.secret = "changeme" play.modules { enables += "play.api.db.DBModule"  enables += "play.api.db.HikariCPModule" } fixedConnectionPool=2 play.i18n { langs = [ "en" ] } play.evolutions { db.default.enabled = false } play.db { prototype { # Sets a fixed JDBC connection pool size of 50 #hikaricp.minimumIdle = 50 #hikaricp.maximumPoolSize = 50 } } db { default.driver=com.mysql.jdbc.Driver default.username=root default.password="nfgwe4706" default.jdbcUrl="jdbc:mysql://localhost:3306/sample_db" } db.default.hikaricp.driverClassName=com.mysql.cp.jdbc.Driver db.default.hikaricp.username=root db.default.hikaricp.password="nfgwe4706" db.default.hikaricp.jdbcUrl="jdbc:mysql://localhost:3306/sample_db" db.default.hikaricp.minimumIdle=${fixedConnectionPool} db.default.hikaricp.maximumPoolSize=${fixedConnectionPool} ebean.default=["model.*"] "assets.cache./public/stylesheets/bootstrap.min.css"="max-age=3600" database.dispatcher{ type=Dispatcher executor="thread-pool-executor" throughput=1 thread-pool-executor{ fixed-pool-size = ${fixedConnectionPool} } }

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

解決策(提案)

スタックトレースをもとにソースコードを調べましたが、かなり変更されているようで、該当の行番号を持つソースが見つかりませんでした。以下は解決策の提案です。playのプロパティ名を使う。
打ち消し線

default.driver = com.mysql.jdbc.Driver default.user = root default.password = "nfgwe4706" default.url = "jdbc:mysql://localhost:3306/sample_db"

以下はurlに含めました。

default.schema = "sample_db" default.port = "3306"

提案理由(推測)

様々なバージョンのソースコードを読んで考えたことをメモとして残します。

エラーの状況
playからコネクションプールのHikariCPを使っているようです。
https://github.com/brettwooldridge/HikariCP/blob/dev/src/main/java/com/zaxxer/hikari/HikariConfig.java

validate()メソッドの該当箇所(調べたソースコードのバージョンが異なるので参考です)

Java

1else if (driverClassName != null) { 2 LOGGER.error("{} - jdbcUrl is required with driverClassName.", poolName); 3 throw new IllegalArgumentException("jdbcUrl is required with driverClassName."); 4}

エラーメッセージの意味は「jdbcUrlが指定されていないのに、driverClassNameが指定されている」
しかし、jdbcUrlは指定している。なぜか?

playの処理
play側でHikariCPに渡すプロパティの名前を変換している。playがdb.defaultで指定するプロパティ名と、HikariCPが使用するプロパティ名が異なるようだ。(調べたソースコードのバージョンが異なるので参考です)
https://github.com/giabao/play-hikaricp/blob/com.sandinh/module-code/app/com/edulify/play/hikaricp/HikariCPConfig.scala

playのプロパティ名HikariCPのプロパティ名
driverdriverClassName
urljdbcUrl
userusername
passwordpassword
defaultAutoCommitautocommit
connectionTestStatementconnectionTestQuery
defaultCatalogcatalog
defaultTransactionIsolationtransactionIsolation
defaultReadOnlyreadOnly
statisticsEnabledregisterMbeans
initSQLconnectionInitSql

https://github.com/openbouquet/HikariCP/blob/master/src/main/java/com/zaxxer/hikari/HikariConfig.java
バージョンが新しくなるとHikariCPのプロパティが増えているようです。

解決策(推測)
db.defaultを使うなら、上記のplayのプロパティ名を使用すれば良いのではないか。
db.hikaricpを指定できれば、上記のHikariCPのプロパティ名を使用できるのではないか。

参考にした設定
https://www.playframework.com/documentation/2.6.x/SettingsJDBC

最新版 play-java-ebean-example による試行

とりあえず動いたのですが、何が正しいかは確認できていません。
https://github.com/playframework/play-java-ebean-example/tree/2.6.x
最新版を git cloneしました。

Bash

1git clone https://github.com/playframework/play-java-ebean-example

実行環境 macOs 10.13.6
データベース環境 fedora 4.19.15-300.fc29.x86_64
データベース mariadb 10.3.11-1

データベースURL jdbc:mysql://10.0.1.2:3306/sample_db
ユーザー rootuser
パスワード nfgwe4706

build.sbt
以下のjdbcドライバーを追加しました。

sbt

1libraryDependencies += "mysql" % "mysql-connector-java" % "8.0.13"

application.conf
db.default.userは、db.default.usernameに変更になりました。
db.default.driverは、com.mysql.cj.jdbc.Driverを使えといっています。

conf

1modules { 2 enabled += "play.api.db.DBModule" 3 enabled += "play.api.db.HikariCPModule" 4} 5fixedConnectionPool=2 6db.default.driver=com.mysql.cj.jdbc.Driver 7db.default.username=rootuser 8db.default.password=nfgwe4706 9db.default.url="jdbc:mysql://10.0.1.2:3306/sample_db" 10db.default.hikaricp { 11 driverClassName=com.mysql.cj.jdbc.Driver 12 username=rootuser 13 password=nfgwe4706 14 jdbcUrl="jdbc:mysql://10.0.1.2:3306/sample_db" 15 minimumIdle=${fixedConnectionPool} 16 maximumPoolSize=${fixedConnectionPool} 17} 18evolutions.db.default { 19 enabled=false 20} 21ebean.default="models.*" 22"assets.cache./public/stylesheets/bootstrap.min.css"="max-age=3600" 23database.dispatcher { 24 type=Dispatcher 25 executor="thread-pool-executor" 26 throughput=1 27 thread-pool-executor { 28 fixed-pool-size = ${fixedConnectionPool} 29 } 30}

db.defaultは省略できません。db.default.hikaricpがないと設定に失敗します。

application.confの設定が正しく反映されない問題

play-java-ebean-exampleを調査中に設定に関するエラーに遭遇しました。設定についてコメントします。

以下のようにdb.default=“deafult”を設定しておき、defaultをオブジェクトとして設定しようとするとエラー。
またHikariCPのvalidate()で、jdbcUrlがnullになるなどのエラーが発生しました。
~~ ~~ ~~db { ~~ ~~ default=“deafult”~~ ~~ ...~~ ~~ deafult { ~~ ~~ url= ~~ ~~ ...~~ ~~ hikaricp {~~ ~~ jdbcUrl=~~ ~~ ~~

playの設定
playの設定は、HOCONフォーマットを使って、typesafe Config で管理しています。

typesafe Configは以下にあります。
https://github.com/lightbend/config
withFallbackを使うと、前に設定された値を優先させることができる。
Javaのシステムプロパティ、application.conf、reference.confは、左が優先する。

HOCONフォーマットの説明は以下です。
https://www.playframework.com/documentation/ja/2.1.x/Configuration
https://github.com/lightbend/config/blob/master/HOCON.md
ファイルに同じプロパティ設定があるならオーバーライドまたはマージしてくれる。「重複したキー」を参照してください。

解決のヒント
質問に、バージョンや設定ファイルの内容が全て添付されていないので、以下は推測になります。

  • 代替設定を使用している可能性 (<--- 2019-01-23 に追加)
  • 設定値がオーバライドされている可能性。後に同じプロパティの設定があり値が’’/nullのものがある。
  • 設定方法が根本的に誤っている可能性。play-java-ebean-exampleの設定方法が誤っている。
  • 該当バージョンのplayの動作がバグを含んでいる。(この可能性は低いでしょう)

これまでやってみて、うまくいったのは以下です。
- デフォルトの設定はすでにreference.confにあるので、設定全体を記述しないで、差分だけを記述する
(デフォルト設定のreference.confは、playのjarの中にあると書かれています)
- 差分は完全修飾名を使って記述する

例えば、以下のように全体を記述しない。この記述方法だと必須項目チェックが行われ、playの設定全体、dbの設定全体を再定義しなければならないのではないかと考えます。
~~ ~~play {~~ ~~ db {~~ ~~ }~~ ~~}~~ ~~

代わりにできるだけ完全修飾名を使って差分のみを記述する。
~~ ~~db.default.url=~~ ~~

再び、試行錯誤をお願いすることになり申し訳ありません。差分を試してみてもうまくいかないなら、この質問はオープンにしておき、application.confの設定について新たに質問してはいかがでしょうか。

play-java-ebean-example 最小設定

資料を調べて、動作を試した結果、最小設定は以下で良いことがわかりました。

conf

1## 追加 mysqlに接続するには以下の4行があれば良い。 2db { 3 default.driver=com.mysql.cj.jdbc.Driver 4 default.username=rootuser 5 default.password=nfgwe4706 6 default.url="jdbc:mysql://10.0.1.2:3306/sample_db" 7} 8## 追加 evolutionが実行されるのを抑制 9evolutions { 10 enabled=false 11 db.default.enabled=false 12} 13## 以下はダウンロードしたオリジナルのapplication.confに含まれていた内容 14## (dispatcher の設定がないと実行エラー) 15ebean.default="models.*" 16"assets.cache./public/stylesheets/bootstrap.min.css"="max-age=3600" 17## オリジナルのfixedConnectionPool 7 -> 2 に変更 18fixedConnectionPool=2 19play.db { 20 prototype { 21 hikaricp.minimumIdle = ${fixedConnectionPool} 22 hikaricp.maximumPoolSize = ${fixedConnectionPool} 23 } 24} 25database.dispatcher { 26 type=Dispatcher 27 executor="thread-pool-executor" 28 throughput=1 29 thread-pool-executor { 30 fixed-pool-size = ${fixedConnectionPool} 31 } 32}

「上記の4行があればmysqlに接続可能」とします。続きは新しいQ&Aに書きます。

投稿2019/01/17 03:34

編集2019/01/23 09:35
退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Nitta

2019/01/25 02:15 編集

返信ありがとうございます。 まず、build.sbtに下記の1文を追加 libraryDependencies += "com.zaxxer" % "HikariCP" % "2.7.1" 先ほど、application.cnfファイルを以下のように書き換えました。 default.driver = com.mysql.jdbc.Driver default.user = root default.password = "nfgwe4706" default.url = "jdbc:mysql://localhost:3306/sample_db" すると以下のエラーが出現しました。 https://github.com/nitta4706/Nitta/blob/master/error_sample2 どのようにすれば、動作するのでしょうか? ご教示下さい(´;ω;`)
退会済みユーザー

退会済みユーザー

2019/01/18 03:12

Caused by: java.lang.IllegalArgumentException: dataSource or dataSourceClassName or jdbcUrl is required. どちらの場合にも、url -> jdbcUrl への渡しがうまくいっていません。ソースコードを調べ直します。 その間、苦し紛れですが、db.prototype.urlを試してみてください。
退会済みユーザー

退会済みユーザー

2019/01/18 03:18

もう一つお願いがあります。db.hikaricp.<HikariCPのプロパティ名>も試してください。
Nitta

2019/01/18 11:38 編集

返信ありがとう御座います。 hikaricp.driverClassName=com.mysql.jdbc.Driver hikaricp.username=root hikaricp.password="nfgwe4706" hikaricpjdbcUrl="jdbc:mysql://localhost:3306/sample_db" でもやってみましたが、 Caused by:hikaricpはobjectではなくリストです! とエラーがでました。 何とかお願いできませんでしょうか?
退会済みユーザー

退会済みユーザー

2019/01/18 05:21

お役に立てず申し訳ありません。調べると次のような情報が出てきました。 db {   default {     driver=com.mysql.jdbc.Driver     url="jdbc:mysql://localhost:3306/sample_db"     user=root     password="nfgwe4706"     hikaricp {     driverClassName=com.mysql.jdbc.Driver     jdbcUrl="jdbc:mysql://localhost:3306/sample_db"     username=root     password="nfgwe4706"     }   } } 時間をください。
Nitta

2019/01/18 11:35

いえ、本当にありがとうございます。 色々調査していただき感謝しかありません! 今週土日は、個人的な事情から少し仕事から外れますので 今後共、宜しくお願いします!
Nitta

2019/01/21 06:42

また、上記の『エラー内容2』が出現します。 設定は application.conf(2018.01.21) に記載してます。 助けてください。
Nitta

2019/01/22 00:46

丁寧な解説ありがとうございます。 完全修飾名などで調整しましたが、上手く行きません。 関連するファイル一連を質問内容の 『DB接続におけるapplication.confの設定内容』 で掲載しています。 是非、回答してやって下さい。 お願いします。
guest

0

ベストアンサー

hikaricpの設定などごちゃ混ぜになっていると思われるので
一旦、標準的な書き方にして試してみてください。

application.conf

1play.db{ 2 #config = "db" 3 #default = "default" 4 5 # Play uses HikariCP as the default connection pool. You can override 6 # settings by changing the prototype: 7 prototype { 8 # Sets a fixed JDBC connection pool size of 50 9 #hikaricp.minimumIdle = 50 10 #hikaricp.maximumPoolSize = 50 11 } 12} 13db{ 14 default.driver=com.mysql.jdbc.Driver 15 default.url="jdbc:mysql://localhost/sample_db" 16 default.username=root 17 default.password="nfgwe4706" 18} 19ebean.default=["models.*"]

投稿2019/01/17 10:48

編集2019/01/18 03:13
taketoma

総合スコア374

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Nitta

2019/01/18 00:21

返信ありがとうございます。 只、先ほどdefault.url="jdbc:mysql://localhost/sample_db" に切り替え走らせたが上手く行きませんでした(´;ω;`)
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問