代码之家  ›  专栏  ›  技术社区  ›  emrekgn

Apache Karaf-如何为MariaDB定义XA数据源?

  •  0
  • emrekgn  · 技术社区  · 7 年前

    马里亚德 HikariCP作为连接池的数据源

    以下是安装的功能:

    karaf@root()> feature:install jndi transaction pax-jdbc-pool-hikaricp pax-jdbc-mariadb jasypt-encryption
    

    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)
    

    服务:列出数据源

    以下是我们在数据源包中使用的配置文件:

    数据源。cfg公司 :

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

    <?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>
    

    我知道 还实现了XADataSource,因此此配置应该可以正常工作。

    我错过了什么?是否需要安装任何缺失的功能,或者此配置是否完全错误?

    提前谢谢。

    1 回复  |  直到 7 年前
        1
  •  0
  •   emrekgn    7 年前

    多亏了C.Schneider的指导,我终于找到了答案。

    我犯的第一个错误是使用HikariCP。根据 this post ,HikariCP尚不支持XA连接。所以我必须切换到DBCP2。

    正如评论中明确解释的那样,使用 是定义数据源更容易理解和清楚的方式。所以我跟着 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