2016-04-04 9 views
2

私は時間を費やしましたが、それは分かりませんでした。私が知っているのは、BasicDataSourceを使用する場合、設定はopenjpa.ConnectionPropertiesプロパティに渡す必要があります。 openjpa.ConnectionPropertiesは、コンマ(、)で区切られたプロパティで、DataSourceインスタンスにマップされます。今すぐMySQLは、コンマ(、)で区切られた形式でホストを期待しています。私はMySQL replicationDataSourceを作成するにはどうすれば、把握することができませんので、?*mysqlのマスター/スレーブレプリケーションの問題:PoolableConnectionFactoryを作成できません

私はOpenJPAのでセットアップマスター/スレーブDBにしようとしていますし、EntityManagerFactoryからcreateEntityManager()を作成しながら、それは以下の例外で失敗します。ここで

コードです:

String driver ="com.mysql.jdbc.ReplicationDriver"; 
String url = "jdbc:mysql:replication://master:3306,slave:3306/db"; 
String user = "abc"; 
String password = "123"; 
String connProps = "DriverClassName={0},Url={1},Username={2},Password={3}"; 

public void method() { 
    connProps = MessageFormat.format(connProps, driver, url, user, password); 
    Properties props = new Properties(); 
    props.setProperty("openjpa.ConnectionProperties", connProps); 
    props.setProperty("openjpa.ConnectionDriverName", "org.apache.commons.dbcp.BasicDataSource"); 
    EntityManagerFactory factory = Persistence.createEntityManagerFactory("mysql", props); 
    EntityManager manager = factory.createEntityManager(); 
} 

私は次の例外を取得:

Exception in thread "main" <openjpa-2.4.1-r422266:1730418 fatal general error> org.apache.openjpa.persistence.PersistenceException: Cannot create PoolableConnectionFactory (Must specify at least one slave host to connect to for master/slave replication load-balancing functionality) 
    at org.apache.openjpa.jdbc.sql.DBDictionaryFactory.newDBDictionary(DBDictionaryFactory.java:106) 
    at org.apache.openjpa.jdbc.conf.JDBCConfigurationImpl.getDBDictionaryInstance(JDBCConfigurationImpl.java:603) 
    at org.apache.openjpa.jdbc.meta.MappingRepository.endConfiguration(MappingRepository.java:1520) 
    at org.apache.openjpa.lib.conf.Configurations.configureInstance(Configurations.java:533) 
    at org.apache.openjpa.lib.conf.Configurations.configureInstance(Configurations.java:458) 
    at org.apache.openjpa.lib.conf.PluginValue.instantiate(PluginValue.java:121) 
    at org.apache.openjpa.conf.MetaDataRepositoryValue.instantiate(MetaDataRepositoryValue.java:68) 
    at org.apache.openjpa.lib.conf.ObjectValue.instantiate(ObjectValue.java:83) 
    at org.apache.openjpa.conf.OpenJPAConfigurationImpl.newMetaDataRepositoryInstance(OpenJPAConfigurationImpl.java:967) 
    at org.apache.openjpa.conf.OpenJPAConfigurationImpl.getMetaDataRepositoryInstance(OpenJPAConfigurationImpl.java:958) 
    at org.apache.openjpa.kernel.AbstractBrokerFactory.makeReadOnly(AbstractBrokerFactory.java:642) 
    at org.apache.openjpa.kernel.AbstractBrokerFactory.newBroker(AbstractBrokerFactory.java:202) 
    at org.apache.openjpa.kernel.DelegatingBrokerFactory.newBroker(DelegatingBrokerFactory.java:154) 
    at org.apache.openjpa.persistence.EntityManagerFactoryImpl.createEntityManager(EntityManagerFactoryImpl.java:226) 
    at org.apache.openjpa.persistence.EntityManagerFactoryImpl.createEntityManager(EntityManagerFactoryImpl.java:153) 
    at org.apache.openjpa.persistence.EntityManagerFactoryImpl.createEntityManager(EntityManagerFactoryImpl.java:59) 
    at ExampleJPA.method(ExampleJPA.java:22) 
    at ExampleJPA.main(ExampleJPA.java:27) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
    at java.lang.reflect.Method.invoke(Method.java:606) 
    at com.intellij.rt.execution.application.AppMain.main(AppMain.java:144) 
Caused by: org.apache.commons.dbcp.SQLNestedException: Cannot create PoolableConnectionFactory (Must specify at least one slave host to connect to for master/slave replication load-balancing functionality) 
    at org.apache.commons.dbcp.BasicDataSource.createPoolableConnectionFactory(BasicDataSource.java:1549) 
    at org.apache.commons.dbcp.BasicDataSource.createDataSource(BasicDataSource.java:1388) 
    at org.apache.commons.dbcp.BasicDataSource.getConnection(BasicDataSource.java:1044) 
    at org.apache.openjpa.lib.jdbc.DelegatingDataSource.getConnection(DelegatingDataSource.java:110) 
    at org.apache.openjpa.lib.jdbc.DecoratingDataSource.getConnection(DecoratingDataSource.java:86) 
    at org.apache.openjpa.jdbc.sql.DBDictionaryFactory.newDBDictionary(DBDictionaryFactory.java:90) 
    ... 22 more 
Caused by: java.sql.SQLException: Must specify at least one slave host to connect to for master/slave replication load-balancing functionality 
    at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:957) 
    at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:896) 
    at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:885) 
    at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:860) 
    at com.mysql.jdbc.NonRegisteringDriver.connectReplicationConnection(NonRegisteringDriver.java:414) 
    at com.mysql.jdbc.NonRegisteringDriver.connect(NonRegisteringDriver.java:313) 
    at org.apache.commons.dbcp.DriverConnectionFactory.createConnection(DriverConnectionFactory.java:38) 
    at org.apache.commons.dbcp.PoolableConnectionFactory.makeObject(PoolableConnectionFactory.java:582) 
    at org.apache.commons.dbcp.BasicDataSource.validateConnectionFactory(BasicDataSource.java:1556) 
    at org.apache.commons.dbcp.BasicDataSource.createPoolableConnectionFactory(BasicDataSource.java:1545) 
    ... 27 more 

データベースのマスタースレーブ設定が正常に動作するようです。私はtelnetを介してマスタからスレーブの接続性をチェックしました。

+0

両方のサーバーで同じdbインスタンスを使用していますか?同じ 'おoz '? – Yazan

+0

はい。私は両方のmysqlセットアップで同じデータベースを利用できます。私はマスターとスレーブのmysqlを正しくセットアップしました。なぜなら、私がmasterデータベースで作業するだけでは、新しいデータが自動的にスレーブに複製されるからです。この問題は、上記の構成を複製機能とともに使用すると発生します。 – YoungHobbit

+0

プロパティを分離して設定しようとした場合、つまり、 'openjpa.ConnectionDriverName'、' openjpa.ConnectionURL'、 'openjpa.ConnectionUserName'、' openjpa.ConnectionPassword'のパラメータに 'props.setProperty()'を使うとどうなりますか? 3つのパラメータ(connProps)を持つ文字列... – Yazan

答えて

4

このソリューションは、非常に多くの時間を費やしてばかげているようです。私はこれを働かせた。私は二重引用符("jdbc:mysql:replication://master:3306,slave:3306/db")でjdbc URLを渡す必要があり、その後正常に動作します。

すぐに詳しい情報を提供します。

2

MySQLのドライバに渡されるJDBCのURLはあなたの考えではありません。 MySQLドライバは、URLを解析しようと

if ((hostStuff != null) && (hostStuff.trim().length() > 0)) { 
     List<String> hosts = StringUtils.split(hostStuff, ",", ALLOWED_QUOTES, ALLOWED_QUOTES, false); 

トークン","を使用して、それを分割し、それは1、より多くを見つけることができないので、エラーが生成されます。

int numHosts = Integer.parseInt(parsedProps.getProperty(NUM_HOSTS_PROPERTY_KEY)); 

    if (numHosts < 2) { 
     throw SQLError.createSQLException("Must specify at least one slave host to connect to for master/slave replication load-balancing functionality", 
       SQLError.SQL_STATE_INVALID_CONNECTION_ATTRIBUTE, null); 
    } 

おそらくJDBC URLが変更されました/ DBCPまたはOpenJPAによって破られました。私はプロパティURLもカンマごとに

を分離された値を持っているときにエラーの理由は、セパレータとしてカンマで、1つの文字列のプロパティを設定するopenjpa.ConnectionPropertiesを使用していると思わsource

+0

はい。あなたは、絶対に正しい。最初のホストだけをMySQLドライバに渡しています。 – YoungHobbit

+0

nice find :)私はゾルを提案するためにこの情報を使用しました。しかし確実ではありません;) – Yazan

0

リンク@rkosegiの回答、何かがカンマに関連して台無しです "、"私はあなたが1つの文字列ではなく、分離されたプロパティを使用する必要があると思うことを解決する。あるいは少なくともUrl={1},を削除することを検討し、ここopenjpa.ConnectionURL

を使用すると、私はあなたがmethod()で行う必要が考えるものであることを設定します。

props.setProperty("openjpa.ConnectionDriverName", "org.apache.commons.dbcp.BasicDataSource"); 
props.setProperty("openjpa.ConnectionUserName", user); 
props.setProperty("openjpa.ConnectionPassword", password); 
props.setProperty("openjpa.ConnectionURL", url); 

は、行を削除します。

props.setProperty("openjpa.ConnectionProperties", connProps); 

String connProps = "DriverClassName={0},Url={1},Username={2},Password={3}";を使用していませんもう

P.S:"org.apache.commons.dbcp.BasicDataSource"ではなくdriverパラメータを使用しているヘッドアップです。それがあなたが望むものであることを確認してください。

+0

これは 'DataSource'インスタンスでは機能しません。 JPAは内部的に 'openjpa.ConnectionProperties'を使用して' DataSource'インスタンスを初期化するためです。 http://openjpa.apache.org/builds/1.2.3/apache-openjpa/docs/ref_guide_dbsetup.html – YoungHobbit

+0

@YoungHobbit hmmm、これについてはわかりませんが、論理的には、 'ConnectionProperties'がコンマで区切られたとき、ホスト(url)リストが台無しになったのですか? – Yazan

+0

なぜ私はそれを使わないことを提案したのですか – Yazan

関連する問題