2017-09-21 124 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