先检查一下是不是安装了JDBC
karaf@root> features:list | grep jdbc
[installed ] [2.3.4 ] jdbc karaf-enterprise-2.3.4 JDBC service and commands
[uninstalled] [3.0.7.RELEASE ] spring-jdbc karaf-2.3.4 Spring 3.0.x JDBC support
[uninstalled] [3.1.4.RELEASE ] spring-jdbc karaf-2.3.4 Spring 3.1.x JDBC support
[uninstalled] [3.2.4.RELEASE ] spring-jdbc karaf-2.3.4 Spring 3.2.x JDBC support
[installed ] [2.12.3 ] camel-jdbc camel-2.12.3
karaf@root>
没有找到camel-jdbc就安装一下
karaf@root> features:install camel-jdbc
karaf@root>
我们先给系统设置一个DataSource 文件名,datasource.xml放到系统发布目录下。
<blueprint xmlns="http://www.osgi.org/xmlns/blueprint/v1.0.0"
xmlns:cm="http://aries.apache.org/blueprint/xmlns/blueprint-cm/v1.0.0">
<bean id="dbcp" destroy-method="close" class="org.apache.commons.dbcp.BasicDataSource">
<property name="driverClassName" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost/test?relaxAutoCommit=true"/>
<property name="username" value="root"/>
<property name="password" value=""/>
</bean>
<service interface="javax.sql.DataSource" ref="dbcp">
<service-properties>
<entry key="osgi.jndi.service.name" value="jdbc/mysqld"/>
<entry key="datasource.name" value="MySQL"/>
</service-properties>
</service>
</blueprint>
在这里要注意一下,我使用的是mysql,那么把mysql的jar包放到lib\ext目录下才可以找到,在lib目录下是无法找到的.例子表的结构如下:
-- 导出 表 test.t_user 结构
CREATE TABLE IF NOT EXISTS `t_user` (
`uid` int(11) NOT NULL AUTO_INCREMENT,
`uname` varchar(50) NOT NULL,
`upwd` varchar(32) NOT NULL,
`udepid` int(11) NOT NULL DEFAULT '0',
`ustatus` int(11) NOT NULL DEFAULT '0',
PRIMARY KEY (`uid`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='用户登录信息';
检查一下是否加载成功。
karaf@root> list | grep datas
[ 210] [Active ] [Created ] [ ] [ 80] datasource.xml (0.0.0)
karaf@root>
建立一个数据查询的blueprint文件
<?xml version="1.0" encoding="UTF-8"?>
<blueprint
xmlns="http://www.osgi.org/xmlns/blueprint/v1.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="
http://www.osgi.org/xmlns/blueprint/v1.0.0
http://www.osgi.org/xmlns/blueprint/v1.0.0/blueprint.xsd">
<camelContext xmlns="http://camel.apache.org/schema/blueprint">
<route>
<from uri="timer://foo?period=10000"/>
<setBody>
<constant>select * from t_user limit 0,1</constant>
</setBody>
<to uri="jdbc:dbcp"/>
<to uri="log:out"/>
</route>
</camelContext>
<reference id="dbcp" interface="javax.sql.DataSource"/>
</blueprint>
我们先来分析一下这个XML文件的内容
<reference id="dbcp" interface="javax.sql.DataSource"/>
引用系统里已经存在的DataSource,“dbcp”是刚才datasource.xml里已经配置好的数据源名称,如果未指名的DataSource等错误就是因为没有引用系统中已经存在的DataSource引起的。
例子是定时查询一个数据库表,然后把查询结果输出到日志文件。必须要先设置查询的语句,通过setBody做为查询参数,还可以使用setHead传入参数
<setBody>
<constant>select * from t_user limit 0,1</constant>
</setBody>
<to uri="jdbc:dbcp"/>
最后把查询的结果输出log.
<to uri="log:out"/>
下面我们来操作ServiceMix查看一下日志情况。先清除日志,使用命令"log:clear",然后执行“log:display”显示日志,第一次不显示,是因为我们设置的定时查询是10秒一次,等几秒,第二次查询就可以看到结果,
karaf@root> log:clear
karaf@root> log:display
karaf@root> log:display
2014-04-22 10:11:24,593 | INFO | 49 - timer://foo | out | ? ? | 110 - org.apache.camel.camel-cor
e - 2.12.3 | Exchange[ExchangePattern: InOnly, BodyType: java.util.ArrayList, Bo
dy: [{uid=1, uname=a, upwd=c, udepid=0, ustatus=0}]]
karaf@root>
到这里,最基本的数据查询已经完成了
以上内容适用于SMX5.X版,到了最新的7.X版已经发生了一些变化
features修改为feature,且dbcp升级为2.X版,安装顺序发生了变化
feature:install jdbc
feature:install pax-jdbc
feature:install pax-jdbc-dbcp2
feature:install pax-jdbc-MySql
blueprint文件发生改变,
org.apache.commons.dbcp.BasicDataSource
变化为
org.apache.commons.dbcp2.BasicDataSource
完整文件代码如下:
<blueprint
xmlns="http://www.osgi.org/xmlns/blueprint/v1.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:cm="http://aries.apache.org/blueprint/xmlns/blueprint-cm/v1.0.0"
xsi:schemaLocation="http://www.osgi.org/xmlns/blueprint/v1.0.0 http://www.osgi.org/xmlns/blueprint/v1.0.0/blueprint.xsd">
<bean id="dbcp" destroy-method="close" class="org.apache.commons.dbcp2.BasicDataSource">
<property name="driverClassName" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost/test?relaxAutoCommit=true"/>
<property name="username" value="root"/>
<property name="password" value=""/>
</bean>
<service interface="javax.sql.DataSource" ref="dbcp">
<service-properties>
<entry key="osgi.jndi.service.name" value="jdbc/mysqld"/>
<entry key="datasource.name" value="MySQL"/>
</service-properties>
</service>
</blueprint>
最后再用log:display查看日志,查询正常,每10秒钟出现一次查询结果