2017-06-19 117 views
0

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

摘录:

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

我在这里损失

回答

1

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

为了不让我的答案受到链接腐烂的影响,我将在这里概述这个过程。

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

在config文件中配置适当的设置我的一个例子是这样的:

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 

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

[email protected]()> service:list javax.sql.DataSource 

这将回显类似th下面列出回来。

[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) 

在这一点上,你可以参考的数据源usign在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 
+0

你不应该使用osgi.jdbc.driver.name和osgi.jdbc.driver.class。只使用其中之一。 –

+0

谢谢, 我其实用同样的方式使用配置文件。如果我输入无效的JNDI名称,我可以列出服务,然后骆驼找到数据源,因为我收到另一条消息。你的过滤器看起来与我的略有不同,但是在尝试这种语法时我得到了同样的错误。 我假设它会工作,如果我将数据源传递给一个bean,但我想在这种情况下使用JDBC组件。 我已经成功地使用骆驼组件,同时直接在蓝图中定义数据源,但我想避免这种情况。 – user5188655

+0

@ChristianSchneider同意了。也不建议复制和粘贴结膜炎。 – Namphibian