2017-06-19 64 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