【问题标题】:Problems accessing datasource in Karaf 4 from Apache Camel从 Apache Camel 访问 Karaf 4 中的数据源的问题
【发布时间】:2017-06-21 11:13:59
【问题描述】:

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

摘自我的蓝图:

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

我很迷茫

【问题讨论】:

    标签: apache-camel apache-karaf apache-servicemix


    【解决方案1】:

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

    为了不让我的回答受到链接腐烂的影响,我将在此处概述该过程。

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

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

        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
    

    【讨论】:

    • 你不应该使用 osgi.jdbc.driver.name 和 osgi.jdbc.driver.class。仅使用其中一种。
    • 谢谢,我实际上是使用配置文件以同样的方式完成的。我可以列出服务,然后骆驼找到数据源,因为如果我输入无效的 JNDI 名称,我会收到另一条消息。您的过滤器看起来与我的略有不同,但是在尝试该语法时,我遇到了同样的错误。我假设如果我将数据源传递给 bean,它会起作用,但我想在这种情况下使用 JDBC 组件。我已经成功地使用了骆驼组件,同时直接在蓝图中定义了数据源,但我想避免这种情况。
    • @ChristianSchneider 同意了。也不建议在结膜炎时复制和粘贴。
    • @user5188655 您能否分享一下您是如何定义 JDBC 组件的?
    • @user5188655 看到这个链接beroslingblade.wordpress.com/2016/03/28/…
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-07-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-12
    相关资源
    最近更新 更多