2016-12-08 19 views
1

jQueryを使用してjQueryを使用してデータベースに接続する方法については、スタックオーバーフローでscalaを使用していましたが、 mysqlデータベースのために正しく。データベースが接続されていないときに例外を回避する

私は例外を回避したいと私の問題は、異なる場合は、最初の接続でトリガ:

ここ
[info] application - Creating Pool for datasource 'mysql' 
[error] application - 

! @72aoamohb - Internal server error, for (GET) [/] -> 

play.api.Configuration$$anon$1: Configuration error[Cannot connect to database [mysql]] 
    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[Failed to initialize pool: Could not create connection to database server. Attempted reconnect 3 times. Giving up.] 
    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: com.zaxxer.hikari.pool.HikariPool$PoolInitializationException: Failed to initialize pool: Could not create connection to database server. Attempted reconnect 3 times. Giving up. 
    at com.zaxxer.hikari.pool.HikariPool.checkFailFast(HikariPool.java:512) 
    at com.zaxxer.hikari.pool.HikariPool.<init>(HikariPool.java:105) 
    at com.zaxxer.hikari.HikariDataSource.<init>(HikariDataSource.java:71) 
    at play.api.db.HikariCPConnectionPool$$anonfun$1.apply(HikariCPModule.scala:58) 
    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) 
Caused by: com.mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConnectionException: Could not create connection to database server. Attempted reconnect 3 times. Giving up. 
    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) 
    at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62) 
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) 
    at java.lang.reflect.Constructor.newInstance(Constructor.java:422) 
    at com.mysql.jdbc.Util.handleNewInstance(Util.java:400) 
    at com.mysql.jdbc.Util.getInstance(Util.java:383) 
    at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:958) 
    at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:937) 
    at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:926) 
    at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:872) 
Caused by: com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Communications link failure 

The last packet sent successfully to the server was 0 milliseconds ago. The driver has not received any packets from the server. 
    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) 
    at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62) 
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) 
    at java.lang.reflect.Constructor.newInstance(Constructor.java:422) 
    at com.mysql.jdbc.Util.handleNewInstance(Util.java:400) 
    at com.mysql.jdbc.SQLError.createCommunicationsException(SQLError.java:1038) 
    at com.mysql.jdbc.MysqlIO.<init>(MysqlIO.java:339) 
    at com.mysql.jdbc.ConnectionImpl.coreConnect(ConnectionImpl.java:2247) 
    at com.mysql.jdbc.ConnectionImpl.connectWithRetries(ConnectionImpl.java:2100) 
    at com.mysql.jdbc.ConnectionImpl.createNewIO(ConnectionImpl.java:2084) 
Caused by: java.net.ConnectException: Connexion refusée 
    at java.net.PlainSocketImpl.socketConnect(Native Method) 
    at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:350) 
    at java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:206) 
    at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:188) 
    at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:392) 
    at java.net.Socket.connect(Socket.java:589) 
    at com.mysql.jdbc.StandardSocketFactory.connect(StandardSocketFactory.java:214) 
    at com.mysql.jdbc.MysqlIO.<init>(MysqlIO.java:298) 
    at com.mysql.jdbc.ConnectionImpl.coreConnect(ConnectionImpl.java:2247) 
    at com.mysql.jdbc.ConnectionImpl.connectWithRetries(ConnectionImpl.java:2100) 

私の設定ファイルである:

db { 

    # You can declare as many datasources as you want. 
    # By convention, the default datasource is named `default` 

    # Mysql database configuration 
    mysql.driver = com.mysql.jdbc.Driver 
    mysql.username = "root" 
    mysql.password = "pass" 
    mysql.schema = "DBCOMPARATOR_DEFAULT" 
    mysql.port = "3306" 
    mysql.url="jdbc:mysql://"${general.hostname}":"${db.mysql.port}"/"${db.mysql.schema}"?autoReconnect=true" 

} 

私のMySQLデータベースが起動しているときと、スキーマは準備が整い、すべて正常に動作し、アプリケーションが起動します。ただし、アプリケーションの起動時にデータベースが実行されていない場合は、この例外を回避したいと考えています。

これが完了したら、データベースに再接続して、データベースが最初にダウンしていないかのように要求を実行できますか?

ご協力いただきありがとうございます。

マット。

+0

基本的に、Webアプリケーションからデータベースサーバーを起動する必要があります。 Uhmmmmm ......... – YoungSpice

+0

ポイントは、複数のデータベースを同時に起動して接続できるようにすることです。データベースを停止しても問題ありません。手動で再起動できます(これはまもなく公開予定です)。私はちょうどデータベースが必要ではない場合でも私のアプリをクラッシュさせるような例外を避けたいです。これが明確であるかどうかわからない... – matthieusb

答えて

0

結局のところ、答えは結構単純です。停止したmysqlデータベース(またはその他のもの)でWebアプリケーションを起動する際のエラーを回避したい場合は、Playのデフォルト設定を使用せず、コントローラ内で直接classic jdbc接続で行うことを選択してください。ここで

は私の設定ファイルです:

libraryDependencies += jdbc 

general.hostname = "localhost" 

# ----------- Custom db configuration for "manual" jdbc connections 
custom.db { 
    # -- Mysql jdbc configuration 
    mysql.driver = "com.mysql.jdbc.Driver" 
    mysql.username = "root" 
    mysql.password = "pass" 
    mysql.schema = "DBCOMPARATOR_DEFAULT" 
    mysql.port = "3306" 
    mysql.options = "autoReconnect=true&failOverReadOnly=false&maxReconnects=10" 
    mysql.url="jdbc:mysql://"${general.hostname}":"${custom.db.mysql.port}"/"${custom.db.mysql.schema}"?"${custom.db.mysql.options} 
} 

Playはデフォルトのデータベース構成として、それを考慮しないように、私は「custom.db」自分自身を定義しました。 は今、ここに私のコントローラコードが(それはすべての設定変数の有効存在をテストしないとされないバグの証拠)である:私もためにフィルタを使用して考えたAlvin Alexander scala documentation and examples

import java.sql.{DriverManager, Connection} 
import javax.inject.Inject 

import play.api.Configuration 
import play.api.mvc.{Action, Controller} 

/** 
    * Created by msb on 08/12/16. 
    */ 
class DatabasesController @Inject() (configuration : Configuration) extends Controller { 

    def mysql_connection_test = Action { 
    val driver : Option[String] = configuration.getString("custom.db.mysql.driver") 
    val url : Option[String] = configuration.getString("custom.db.mysql.url") 
    val username : Option[String] = configuration.getString("custom.db.mysql.username") 
    val password : Option[String] = configuration.getString("custom.db.mysql.password") 

    var connection : Option[Connection] = None 
    try { 
     Class.forName(driver.get) 
     connection = Some(DriverManager.getConnection(url.get, username.get, password.get)) 

     System.out.println(connection) 

    } catch { 
     case e : Exception => e.printStackTrace() 
    } 

    Ok("Still has to be tested") 
    } 
} 

私はこのチュートリアルからそれを取りました例外をキャッチしますが、十分にきれいに見えませんでした。このコードは、たとえばクラスを使用して改善することができます。

これは誰でも同じ問題を解決するのに役立ちます。

関連する問題