第 5 章 ClearWork应用架构——持久化层

MVC Model Layer

5.1. JDBC数据源支持

spring.xml 中利用 dataSource 作为基础的数据源/连接池; transactionManager 作为默认的JDBC事务管理器,被用来管理基于JDBC数据源的业务(Business)层的事务。

利用Spring2.0提供的AOP自动代理的底层架构(基于 AspectJ 切点语言),我们可以很方便的对特定的业务类、方法进行事务拦截、包装等处理, 例如我们可以这样定义一个对于JDBC事务的拦截器:

				
	<tx:advice id="txAdvice" transaction-manager="transactionManager">
		<tx:attributes>
			<tx:method name="insert*" />
			<tx:method name="delete*" />
			<tx:method name="update*" />
			<tx:method name="*" read-only="true" />
		</tx:attributes>
	</tx:advice>
				
			

很明显,它对于"insert", "delete", "update"开头的方法进行事务包装。 我们可以通过下面的配置使其绑定于特定的业务服务类:

				
	<aop:config>
		<aop:advisor pointcut="execution(* *..IUserService.*(..))"
			advice-ref="txAdvice" />
	</aop:config>
				
			

以上的应用示范位于ClearWork Sample的 spring-sample.xml ,以供参考 。

5.2. Hibernate数据源支持

作为轻量级ORM数据管理框架的优秀代表,Hibernate被ClearWork良好的支持和集成。同样的,需要在 spring.xml 中利用 dataSource 作为基础的数据源/连接池;由于各模块需要定义自己的ORM文件(.hbm),因此 sessionFactory 在全局配置中被声明为抽象的(abstract), 您需要在模块级的Spring配置中继承这个sessionFactory,指定ORM配置(.hbm文件),例如:

				
	<bean id="sampleSessionFactory" parent="sessionFactory">
		<property name="mappingResources">
			<list>
				<value>
					net\sf\clearwork\sample\domain\hibernate\CContact.hbm.xml
				</value>
				<value>
					net\sf\clearwork\sample\domain\hibernate\CNews.hbm.xml
				</value>
				<value>
					net\sf\clearwork\sample\domain\hibernate\CUser.hbm.xml
				</value>
			</list>
		</property>
	</bean>
				
			

相应的,Hibernate的事务管理器也需要在相应的模块级Spring配置中指定:

				
	<!-- Transaction manager for a single Hibernate SessionFactory (alternative to JTA) -->
	<bean id="hibernateTransactionManager"
		class="org.springframework.orm.hibernate3.HibernateTransactionManager">
		<property name="sessionFactory" ref="sampleSessionFactory" />
	</bean>
				
			

接下来的情况与JDBC基本相同。利用Spring2.0提供的AOP自动代理的底层架构(基于 AspectJ 切点语言),我们可以很方便的对特定的业务类、方法进行事务拦截、包装等处理, 例如我们可以这样定义一个对于Hibernate事务的拦截器:

				
	<tx:advice id="txAdviceHibernate"
		transaction-manager="hibernateTransactionManager">
		<tx:attributes>
			<tx:method name="insert*" />
			<tx:method name="delete*" />
			<tx:method name="update*" />
			<tx:method name="*" read-only="true" />
		</tx:attributes>
	</tx:advice>
				
			

很明显,它对于"insert", "delete", "update"开头的方法进行事务包装。 我们可以通过下面的配置使其绑定于特定的业务类:

				
	<aop:config>
		<aop:advisor pointcut="execution(* *..IUserService.*(..))"
			advice-ref="txAdviceHibernate" />
	</aop:config>
				
			

以上的应用示范位于ClearWork Sample的 spring-sample.xml ,以供参考 。

5.3. Proxool数据库连接池

Proxool这个开源项目可以提供对您选择的任何数据驱动的连接池封装。它可以非常简单的移植到现存的代码中。 完全可配置,能够有效、及时的回收连接资源;能够智能的分配、重用数据库连接资源。 快速,成熟,健壮。可以透明地为您现存的JDBC驱动程序增加连接池功能。 ClearWork对其进行了有效的集成,使之能方便被使用在Spring框架中,作为数据源(DataSource)代码如下:

				
	<bean id="dataSource" lazy-init="false"
		class="org.logicalcobwebs.proxool.ProxoolDataSource">
		<property name="alias" value="ClearWork Connection Pool" />
		<property name="statistics" value="1m,15m,1d" />
		<property name="simultaneousBuildThrottle" value="25" />
		<property name="maximumConnectionCount" value="25" />
		<property name="driver" value="${jdbc.driverClassName}" />
		<property name="driverUrl" value="${jdbc.url}" />
		<property name="user" value="${jdbc.username}" />
		<property name="password" value="${jdbc.password}" />
		<property name="delegateProperties">
			<value>user=${jdbc.username}</value>
			<!--value>user=sa,password=sa</value-->
		</property>
	</bean>
				
			

注意: delegateProperties 这个属性的配置是必须的,你需要在这里再次指定连接数据库的user或user/password, 它是为了修正Proxool现存版本的一个小Bug。

Proxool为您提供了一个基于Web的管理控制台,能够方便的管理数据库连接池。

Proxool/ClearWork数据库连接池管理控制台_效果1

Proxool/ClearWork数据库连接池管理控制台_效果2

此管理控制台是一个Servlet,需要在web.xml中配置:

				
	<servlet>
		<servlet-name>proxoolAdmin</servlet-name>
		<servlet-class>
			net.sf.clearwork.persistent.proxool.AdminServlet
		</servlet-class>
	</servlet>