2016-03-24 16 views
0

Ich habe Probleme mit dem Erstellen von nicht gepoolten Datenquelle mit MariaDBDataSource-Klasse.Wie man MariaDBDataSource manuell erstellt und konfiguriert

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

wrapWithPool einfach hüllt die gegebene Datenquelle mit einer gepoolten eines (c3p0 Pool). Aber ich kann eine Verbindung aus dem Pool nicht auschecken. Jedes Mal, wenn ich

datasource.getConnection() 

ich

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

nicht sicher, warum? Ich lege kein leeres Passwort fest. Gibt es noch etwas, das in der MariaDbDatasource-Klasse festgelegt werden muss, damit das Kennwort verwendet wird?

bearbeiten: Ok, so scheint es, dass, wenn ich die MariaDbDataSource nicht wickeln alle funktioniert ok. So c3p0 wird die Verbindung Zerschlagung und von Debug Ich sehe es nicht um das Passwort zu erhalten ... Die Wrap-Methode ist ganz einfach

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); 

     } 

Und es funktioniert perfecly gut mit anderen Fahrern (Oracle, jtds) . Warum nicht mit MariaDb?

Antwort

0

Ok, also habe ich das Problem entdeckt. Aus irgendeinem Grund umschließt c3p0 beim Erstellen des Pools die angegebene DataSource-Klasse innerhalb der eigenen WrapperConnectionPoolDataSourceBase-Klasse. Dann versucht es, die Authentifizierungsparameter durch Reflexion zu erkennen. Da MariaDBDataSource die getPassword-Methode nicht zur Verfügung stellt, ist der erkannte Wert null und daher die Fehlermeldung, dass das Kennwort nicht verwendet wird.

Um dieses Problem zu umgehen habe ich eine einfache Hülle

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; 
     } 
    } 

und später

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

Und es beginnt auf magische Weise zu arbeiten. Dies ist ein Treiberproblem, da die Oracle-Datenquelle nicht über die Methode getPassword verfügt, aber funktioniert. Daher machen einige sehr spezifische Implementierungsdetails dieser 2 Bibliotheken es in meinem Anwendungsfall einfach inkompatibel.

Verwandte Themen