2016-03-24 22 views
0

MariaDBDataSourceクラスを使用してプールされていないデータソースを作成する際に問題があります。MariaDBDataSourceを手動で作成および設定する方法

MariaDbDataSource mysqlDs = new MariaDbDataSource(connectionUrl); 
mysqlDs.setPassword(password); 
mysqlDs.setUser(username); 
return wrapWithPool(mysqlDs); 

wrapWithPoolは、指定されたデータソースを単にプールされたデータソース(c3p0プール)でラップします。 しかし、私はプールからの接続をチェックアウトできません。私は

datasource.getConnection() 

を行うたびに、私はなぜ

org.mariadb.jdbc.internal.util.dao.QueryException: Could not connect: Access denied for user 'someuser'@'somehost' (using password: NO) 

わからないのですか?私は空でないパスワードを設定します。パスワードを使用するためにMariaDbDatasourceクラスに設定する必要はありますか?

編集: 私がMariaDbDataSourceをラップしていないときは、そうだと思います。 C3P0が接続を解体して、デバッグから、私はそれがパスワードの取得に失敗した参照だから... ... ラップ方法は

private static DataSource wrapWithPool(DataSource unpooled) throws SQLException { 
      unpooled.setLoginTimeout(HOST_REACH_TIMEOUT.getValue()); 
      Map<String, Object> poolOverrideProps = new HashMap<>(); 
      poolOverrideProps.put("maxPoolSize", CONNECTION_POOL_SIZE.getValue()); 
      poolOverrideProps.put("minPoolSize", 1); 
      poolOverrideProps.put("checkoutTimeout", HOST_REACH_TIMEOUT.getValue() * 2); 
      return DataSources.pooledDataSource(unpooled, poolOverrideProps); 

     } 

非常に簡単であり、他のドライバ(オラクル、JTDS)でperfecly正常に動作します。 mariaDbと一緒にならないのはなぜですか?

答えて

0

私は問題を発見しました。何らかの理由で、プールを作成するときのc3p0は、指定されたDataSourceクラスを独自のWrapperConnectionPoolDataSourceBaseクラス内にラップします。その後、リフレクションを使用して認証パラメータを検出しようとします。 MariaDBDataSourceはgetPasswordメソッドを提供しないため、検出された値はnullであるため、パスワードを使用しないというエラーメッセージが表示されます。

だから回避策として、私は単純なラッパー

MariaDbDExtender mysqlDs = new MariaDbDExtender(connectionUrl); 
mysqlDs.setPassword(password); 
mysqlDs.setUser(username); 
return wrapWithPool(mysqlDs); 

private static class MariaDbDExtender extends MariaDbDataSource { 

     private String password; 

     public MariaDbDExtender(String connectionUrl) throws SQLException { 
      super(connectionUrl); 
     } 


     @Override 
     public void setPassword(String pass) { 
      this.password = pass; 
      super.setPassword(pass); 
     } 

     //this method is required to allow c3p0 magically use reflection to get correct password for connection 
     public String getPassword() { 
      return password; 
     } 
    } 

以降を行なったし、それは魔法のように動作を開始します。 oracle datasourceにはgetPasswordメソッドがありませんが、これはドライバ特有の問題です。したがって、これら2つのライブラリの非常に具体的な実装の詳細は、私のユースケースでは互換性がありません。

関連する問題