2017-09-21 106 views
0

我們正在嘗試安裝MariaDB以HikariCP作爲conn的數據源。游泳池在Apache Karaf 4.1.2Apache Karaf - 如何爲MariaDB定義XA數據源?

這些都是安裝的功能:與創建

[email protected]()> feature:install jndi transaction pax-jdbc-pool-hikaricp pax-jdbc-mariadb jasypt-encryption 

如果我們blueprint.xml只使用(非XA)數據源服務的定義,一切工作正常,我們可以看到數據源(和DataSourceFactory)實例沒問題:

[email protected]()> service:list DataSource 
[javax.sql.DataSource] 
---------------------- 
datasource.name = MySQL 
osgi.jndi.service.name = jdbc/testdb 
osgi.service.blueprint.compname = dataSource 
service.bundleid = 79 
service.id = 147 
service.scope = bundle 
Provided by : 
Test MariaDB Datasource Bundle (79) 

但是,如果我們在blueprint.xml使用的XADataSource,沒有數據源創建(服務:列表數據源返回空)

這些都是我們在數據源捆綁使用的配置文件:

datasource.cfg

db.server = DB_SERVER_IP:3306 
db.database = testdb 
db.username = root 
db.password = ENC(sZwyfHzdvZSVoDDeU2/Vnw==) 

blueprint.xml

<?xml version="1.0" encoding="UTF-8"?> 
<blueprint xmlns="http://www.osgi.org/xmlns/blueprint/v1.0.0" 
xmlns:cm="http://aries.apache.org/blueprint/xmlns/blueprint-cm/v1.1.0" 
xmlns:enc="http://karaf.apache.org/xmlns/jasypt/v1.0.0" 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
default-activation="eager" 
xsi:schemaLocation=" 
      http://www.osgi.org/xmlns/blueprint/v1.0.0 http://www.osgi.org/xmlns/blueprint/v1.0.0/blueprint.xsd 
      http://aries.apache.org/blueprint/xmlns/blueprint-cm/v1.1.0 http://svn.apache.org/repos/asf/aries/trunk/blueprint/blueprint-cm/src/main/resources/org/apache/aries/blueprint/compendium/cm/blueprint-cm-1.1.0.xsd 
    "> 

<cm:property-placeholder persistent-id="datasource" 
    update-strategy="reload"> 
</cm:property-placeholder> 

<enc:property-placeholder> 
    <enc:encryptor class="org.jasypt.encryption.pbe.StandardPBEStringEncryptor"> 
     <property name="config"> 
      <bean class="org.jasypt.encryption.pbe.config.EnvironmentStringPBEConfig"> 
       <property name="algorithm" value="PBEWITHMD5ANDTRIPLEDES" /> 
       <property name="password" value="DB_ENC_PWD" /> 
      </bean> 
     </property> 
    </enc:encryptor> 
</enc:property-placeholder> 

<!-- This works just fine! --> 
<service ref="dataSource" interface="javax.sql.DataSource"> 
    <service-properties> 
     <entry key="osgi.jndi.service.name" value="jdbc/testdb" /> 
     <entry key="datasource.name" value="MySQL" /> 
    </service-properties> 
</service> 

<!-- But if we use this one, no DataSource is created... --> 
<service ref="dataSource" interface="javax.sql.XADataSource"> 
    <service-properties> 
     <entry key="osgi.jndi.service.name" value="jdbc/testdbxa" /> 
     <entry key="datasource.name" value="MySQL" /> 
    </service-properties> 
</service> 

<bean id="dataSource" class="org.mariadb.jdbc.MariaDbDataSource"> 
    <property name="databaseName" value="${db.database}" /> 
    <property name="url" 
     value="jdbc:mariadb://${db.server}/${db.database}?characterEncoding=UTF-8" /> 
    <property name="user" value="${db.username}" /> 
    <property name="password" value="${db.password}" /> 
</bean> 

</blueprint> 

我知道組織。 mariadb.jdbc.MariaDbDataSource也實現了XADataSource,所以這個配置是d一直工作得很好。

我在這裏錯過了什麼?是否有任何需要安裝的缺失功能或此配置是否完全錯誤?

在此先感謝。

+0

如果使用pax-JDBC的配置,那麼你應該不會造成藍圖的數據源。相反,請創建一個pax-jdbc配置,爲您創建數據源。 –

+0

感謝您的提示。我已經刪除了pax-jdbc-config並再次嘗試,但結果保持不變。我想知道爲MariaDB定義XA數據源的正確方法是什麼。 Karaf教程包含德比的XA數據源示例,我認爲這些步驟應該是相同的,但我無法弄清楚...... – emrekgn

+0

這個想法是簡單地使用pax-jdbc-config併爲mariadb創建一個合適的配置,發佈一個XA準備好並彙集DataSource –

回答

0

最後,我想到了謝謝C.施耐德的指導。

我犯的第一個錯誤是使用HikariCP。根據this post,HikariCP還不支持XA連接。所以我必須切換到DBCP2。

正如在評論中清楚地解釋的那樣,使用pax-jdbc-config是定義數據源的更容易理解和清晰的方式。所以我也跟着this documentation和,而不是一個數據源束(藍圖方式),剛剛創建這個配置文件:

osgi.jdbc.driver.class = org.mariadb.jdbc.Driver 
osgi.jdbc.driver.name=mariadb 
pool=dbcp2 
xa=true 
databaseName=testdb 
user=root 
password=1 
url=jdbc:mariadb://DB_SERVER_IP/testdb?characterEncoding=UTF-8 
dataSourceName=testdb