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

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

ただいまの
回答率

87.59%

PlayframeworkでのDB接続

解決済

回答 2

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 3,121

score 88

お世話になってます。
今、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}
 }
}
  • 気になる質問をクリップする

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

+1

 解決策(提案)

スタックトレースをもとにソースコードを調べましたが、かなり変更されているようで、該当の行番号を持つソースが見つかりませんでした。以下は解決策の提案です。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()メソッドの該当箇所(調べたソースコードのバージョンが異なるので参考です)

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

エラーメッセージの意味は「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のプロパティ名
driver driverClassName
url jdbcUrl
user username
password password
defaultAutoCommit autocommit
connectionTestStatement connectionTestQuery
defaultCatalog catalog
defaultTransactionIsolation transactionIsolation
defaultReadOnly readOnly
statisticsEnabled registerMbeans
initSQL connectionInitSql

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

git 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ドライバーを追加しました。

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

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

modules {
  enabled += "play.api.db.DBModule"
  enabled += "play.api.db.HikariCPModule"
}
fixedConnectionPool=2
db.default.driver=com.mysql.cj.jdbc.Driver
db.default.username=rootuser
db.default.password=nfgwe4706
db.default.url="jdbc:mysql://10.0.1.2:3306/sample_db"
db.default.hikaricp {
  driverClassName=com.mysql.cj.jdbc.Driver
  username=rootuser
  password=nfgwe4706
  jdbcUrl="jdbc:mysql://10.0.1.2:3306/sample_db"
  minimumIdle=${fixedConnectionPool}
  maximumPoolSize=${fixedConnectionPool}
}
evolutions.db.default {
    enabled=false
}
ebean.default="models.*"
"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}
  }
}


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  最小設定

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

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


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

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/01/18 20:35

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

    キャンセル

  • 2019/01/21 15:42

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

    キャンセル

  • 2019/01/22 09:46

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

    キャンセル

checkベストアンサー

0

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

play.db{
  #config = "db"
  #default = "default"

  # Play uses HikariCP as the default connection pool.  You can override
  # settings by changing the prototype:
  prototype {
    # Sets a fixed JDBC connection pool size of 50
    #hikaricp.minimumIdle = 50
    #hikaricp.maximumPoolSize = 50
  }
}
db{
 default.driver=com.mysql.jdbc.Driver
  default.url="jdbc:mysql://localhost/sample_db"
  default.username=root
  default.password="nfgwe4706"
}
ebean.default=["models.*"]

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/01/18 09:21

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

    キャンセル

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

  • ただいまの回答率 87.59%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る