没用osgi框架开发之前习惯了用spring配置c3p0连接池连接oracle,配置数据库事务管理器,用ibatis操作数据,下面说下怎么在osgi中配置数据库连接,事务后面再介绍。在设计bundle时每个bundle只完成单一功能,保证每个bundle的高可复用性。下面的demo中会建3个bundle,现在bundle还很少,真正在开发的时候bundle会很多,hundle之前的依赖一定要在前期设计时理清楚,否则到后期很容易出现bundle之间的循环依赖。Demo里数据库操作是用ibatis写的,把ibatis提供的数据库访问封装了一层,如果没用过ibatis可以看数据库连接,然后自己配置需要的数据持久化框架和数据库。
com.ferry.daoService 创建数据库连接
com.ferry.databaseService 操作数据库
com.ferry.bussinessService 具体业务处理
<bean id="oracle_datasource" class="com.mchange.v2.c3p0.ComboPooledDataSource" destroy-method="close"> <property name="driverClass"><value> oracle.jdbc.driver.OracleDriver </value></property> <property name="jdbcUrl"><value>根据自己环境填写jdbcUrl</value></property> <property name="user"><value>根据自己环境填写user</value></property> <property name="password"><value>根据自己环境填写password</value></property> <property name="minPoolSize"><value>10</value></property> <property name="maxPoolSize"><value>30</value></property> <property name="initialPoolSize"><value>10</value></property> <!--当连接池中的连接耗尽的时候c3p0一次同时获取的连接数。Default: 3 --> <property name="acquireIncrement"><value>5</value></property> <!--定义在从数据库获取新连接失败后重复尝试的次数。Default: 30 --> <property name="acquireRetryAttempts"><value>10</value></property> <!--两次连接中间隔时间,单位毫秒。Default: 1000 --> <property name="acquireRetryDelay"><value>1000</value></property> <!--当连接池用完时客户端调用getConnection()后等待获取新连接的时间,超时后将抛出 SQLException,如设为0则无限期等待。单位毫秒。Default: 0 --> <property name="checkoutTimeout"><value>0</value></property> <!--每240秒检查所有连接池中的空闲连接。Default: 0 --> <property name="idleConnectionTestPeriod"><value>240</value></property> <!--定义所有连接测试都执行的测试语句。在使用连接测试的情况下这个一显著提高测试速度。注意: 测试的表必须在初始数据源的时候就存在。Default: null--> <property name="preferredTestQuery"><value>select 1 from dual</value></property> </bean> <bean id="sqlMapClient" class="org.springframework.orm.ibatis.SqlMapClientFactoryBean"> <property name="configLocation"> <value>/ORM_RESOURCES/sqlMapConfig.xml</value> </property> </bean> <bean id="sqlDao_i" class="com.ferry.daoService.impl.BatisGenericDao"> <property name="dataSource"> <ref local="oracle_datasource" /> </property> <property name="sqlMapClient"> <ref local="sqlMapClient" /> </property> </bean> <osgi:service ref="sqlDao_i" interface="com.ferry.daoService.IbatisGenericDao" />
用到的c3p0jar包不是基于osgi开发的,所以这里要osgi化,集体操作可以参考上一章
daoService依赖如下bundle启动osgi后会报如下错,因为我们在上面的配置文件中将driverClass配置成oracle.jdbc.driver.OracleDriver,该类在classes12.jar包中,所以这里我们还要继续把这个包osgi化
java.lang.ClassNotFoundException: oracle.jdbc.driver.OracleDriver
输入命令后会看到如下显示,首先会根据配置建立数据库连接池,然后执行数据库操作
我们配置了minPoolSize为10,所以此时打开pl/sql的Sessions会看到一次建了10个连接
代码我就不贴出来了,想看具体代码可以自己下
用到的jar包
com.springsource.com.ibatis-2.3.4.726.jar
com.springsource.org.aopalliance-1.0.0.jar
jcl-over-slf4j-1.6.4.jar
logback-classic-1.0.0.jar
logback-core-1.0.0.jar
org.eclipse.equinox.ds_1.3.1.R37x_v20110701.jar
org.eclipse.equinox.util_1.0.300.v20110502.jar
org.eclipse.osgi.services_3.3.0.v20110513.jar
org.eclipse.osgi_3.7.2.v20120110-1415.jar
org.springframework.aop-2.5.6.SEC03.jar
org.springframework.beans-2.5.6.SEC03.jar
org.springframework.context-2.5.6.SEC03.jar
org.springframework.core-2.5.6.SEC03.jar
org.springframework.jdbc-2.5.6.SEC03.jar
org.springframework.orm-2.5.6.SEC03.jar
org.springframework.transaction-2.5.6.SEC03.jar
slf4j-api-1.6.4.jar
spring-osgi-core-1.2.1.jar
spring-osgi-extender-1.2.1.jar
spring-osgi-io-1.2.1.jar
spring-osgi-mock-1.2.1.jar