从 Apache Camel 访问 Karaf 4 中的数据源时出现问题

Problems accessing datasource in Karaf 4 from Apache Camel

我在 Karaf 4 (ServiceMix 7) 中创建了一个从 karaf 控制台运行的数据源——我可以列出表、执行查询等等。 我的问题是当我尝试从我的 Camel 路线使用它时。

我的蓝图摘录:

...
<reference filter="(osgi.jndi.service.name=jdbc/erp)" id="erpDataSource" interface="javax.sql.DataSource"/>
...
<to id="erpSelectQuery" uri="jdbc:erpDataSource"/>
...

它找到了我的数据源,但由于以下原因蓝图无法启动:

"java.lang.IllegalArgumentException: connectionFactory must be specified"

我的数据源是使用以下方法创建的:

jdbc:ds-create -dbName erp -dt DataSource -dn mysql -u erp -dc com.mysql.jdbc.Driver -p pre jdbc/erp

我在这里不知所措

我从来没有通过 jdbc 命令语法完成它我遵循了 Ops4J Wiki On Datasource creation 的指南,我喜欢它的原因之一,这个方法创建了一个简单的文本文件,可以由不只是 Java 开发人员,即修改和故障排除更容易。

为了不让我的回答受到 link 腐烂的影响,我将在这里概述程序。

使用以下命名约定 org.ops4j.datasource-give_your_datasource_a_name.cfg 在 /servicemixhome/etc 中创建数据源配置文件(简单文本文件)。

在配置文件中配置适当的设置,我的示例如下所示:

    osgi.jdbc.driver.class = com.mysql.jdbc.Driver
    databaseName=dhData
    user=foo
    url=jdbc:mysql://192.199.199.199:3306/dhData
    password=somepassword
    dataSourceName=myDSName 

确保您安装了 ops4j 所需的功能:

feature:install pax-jdbc-mysql pax-jdbc-config

现在使用以下语法列出数据源:

karaf@root()> service:list javax.sql.DataSource

这将回显类似于下面列表的内容。

[javax.sql.DataSource]
----------------------

    osgi.jdbc.driver.class = com.mysql.jdbc.Driver
    databaseName=dhData
    user=foo
    url=jdbc:mysql://192.199.199.199:3306/dhData
    password=somepassword
    dataSourceName=myDSName 
Provided by : 
    OPS4J Pax JDBC Config (216)

此时您可以使用以下语法在 blueprint.xml 中使用 osgi 过滤器引用数据源:

<reference filter="(&amp;(objectClass=javax.sql.DataSource)(dataSourceName=myDSName ))" id="myData" interface="javax.sql.DataSource"/>

然后将其作为 bean 的 属性 引用,例如,您可以执行以下操作:

    <bean class="foo.bar" id="ImsCbrEventsBean">
        <property name="dataSource" ref="myData"/>
    </bean>

请记住,这会创建一个到数据库的单一连接,您应该真正创建一个连接池。

这可以通过安装 pax-jdbc-pool-dbcp2 功能或任何其他连接池来完成,但一次只使用一个,然后修改数据源配置文件以携带适当的信息,例如下面的例子:

    osgi.jdbc.driver.name = mysql
    databaseName=dhData
    user=foo
    url=jdbc:mysql://192.199.199.199:3306/dhData
    password=somepassword
    dataSourceName=myDSName 
    jdbc.pool.maxTotal=32
    jdbc.pool.blockWhenExhausted=true
    jdbc.pool.lifo=false
    jdbc.pool.maxIdle=24
    jdbc.pool.maxWaitMillis=5000
    jdbc.pool.minEvictableIdleTimeMillis=1800000
    jdbc.pool.minIdle=16
    jdbc.pool.numTestsPerEvictionRun=3
    jdbc.pool.softMinEvictableIdleTimeMillis=-1
    jdbc.pool.testOnBorrow=true
    jdbc.pool.testOnCreate=true
    jdbc.pool.testOnReturn=true
    jdbc.pool.testWhileIdle=true
    jdbc.pool.timeBetweenEvictionRunsMillis=3600000