Apache Karaf - 如何为 MariaDB 定义 XA 数据源?
Apache Karaf - How to define XA data source for MariaDB?
我们正在尝试使用 HikariCP 作为连接设置 MariaDB 数据源。 Apache Karaf 4.1.2.
中的池
这些是安装的功能:
karaf@root()> feature:install jndi transaction pax-jdbc-pool-hikaricp pax-jdbc-mariadb jasypt-encryption
如果我们只使用 blueprint.xml 中的(非 XA)DataSource 服务定义,一切正常,我们可以看到创建的 DataSource(和 DataSourceFactory)实例没有问题:
karaf@root()> 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,则不会创建任何数据源(service:list DataSource returns 空)
这些是我们在数据源包中使用的配置文件:
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>
我知道 org.mariadb.jdbc.MariaDbDataSource 也实现了 XADataSource,所以这个配置应该工作得很好。
我在这里错过了什么?是否缺少任何需要安装的功能,或者此配置是否完全错误?
提前致谢。
在C. Schneider的指导下,终于搞定了。
我犯的第一个错误是使用了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
我们正在尝试使用 HikariCP 作为连接设置 MariaDB 数据源。 Apache Karaf 4.1.2.
中的池这些是安装的功能:
karaf@root()> feature:install jndi transaction pax-jdbc-pool-hikaricp pax-jdbc-mariadb jasypt-encryption
如果我们只使用 blueprint.xml 中的(非 XA)DataSource 服务定义,一切正常,我们可以看到创建的 DataSource(和 DataSourceFactory)实例没有问题:
karaf@root()> 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,则不会创建任何数据源(service:list DataSource returns 空)
这些是我们在数据源包中使用的配置文件:
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>
我知道 org.mariadb.jdbc.MariaDbDataSource 也实现了 XADataSource,所以这个配置应该工作得很好。
我在这里错过了什么?是否缺少任何需要安装的功能,或者此配置是否完全错误?
提前致谢。
在C. Schneider的指导下,终于搞定了。
我犯的第一个错误是使用了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