从 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="(&(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
我在 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="(&(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