关注Nutz已经有段时间了,一直没有时间仔细研究Nutz。这几天抽空研究了下Nutz DAO部分,总体上觉得Nutz的质量令人振奋,Nutz DAO部分也非常好用。
目前个人觉得Nutz DAO在事务管理方面设计得不够好,有待改进,可以参考Nutz 网站上本人提的Issue(http://code.google.com/p/nutz/issues/detail?id=162)。主要的问题是:事务控制的代码和业务逻辑代码耦合在一起。解决的方法应该大致有两种:
1、通过Issue中讨论的,采用@Tran注解;
2、和Ioc部分配合,采用声明式事物管理;
个人更喜欢声明式事物管理方式,而spring提供了非常好的声明式事物管理方案,所以在这里主要讨论下Nutz DAO和spring集成的细节问题。
Nutz DAO和spring集成也有两种方式:
1、采用spring的Ioc,但是事务还是采用Nutz自己管理控制;
2、采用spring的声明式事务管理控制;
接下来我们仔细讨论下这两种方式。
方式1:方式1非常简单,Nutz DAO不需要做任何修改即能完成,你可以在你的项目的spring配置文件中添加如下配置即可:
<!-- the DataSource -->
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
<property name="driverClassName" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://127.0.0.1:3306/zdtest"/>
<property name="username" value="root"/>
<property name="password" value="root"/>
</bean>
<!-- Nutz DAO -->
<bean id="dao" class="org.nutz.dao.impl.NutDao">
<property name="dataSource" ref="dataSource"/>
</bean>
<!-- your service object that refer to the Nutz DAO -->
<bean id="petService" class="cn.zj.pubinfo.nutz.pet.PetService">
<property name="dao" ref="dao"/>
</bean>
这种模式下,spring只提供了Ioc,事务还是有Nutz自己管理和控制。
方式2:
我们要在spring中声明事务管理,大致可以如下:
<!-- Nutz DAO -->
<bean id="dao" class="org.nutz.dao.impl.NutDao">
<property name="dataSource" ref="dataSource"/>
</bean>
<bean id="petDao" class="cn.zj.pubinfo.nutz.pet.PetDao">
<property name="dao" ref="dao"/>
</bean>
<!-- this is the service object that we want to make transactional -->
<bean id="petService" class="cn.zj.pubinfo.nutz.pet.PetService">
<property name="petDao" ref="petDao"/>
</bean>
<!-- the transactional advice (what 'happens'; see the <aop:advisor/> bean below) -->
<tx:advice id="txAdvice" transaction-manager="txManager">
<!-- the transactional semantics... -->
<tx:attributes>
<!-- all methods starting with 'get' are read-only -->
<tx:method name="get*" read-only="true"/>
<!-- other methods use the default transaction settings (see below) -->
<tx:method name="*"/>
</tx:attributes>
</tx:advice>
<!-- ensure that the above transactional advice runs for any execution
of an operation defined by the FooService interface -->
<aop:config>
<aop:pointcut id="petServiceOperation" expression="execution(* cn.zj.pubinfo.nutz.pet.PetService.*(..))"/>
<aop:advisor advice-ref="txAdvice" pointcut-ref="petServiceOperation"/>
</aop:config>
<!-- don't forget the DataSource -->
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
<property name="driverClassName" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://127.0.0.1:3306/zdtest"/>
<property name="username" value="root"/>
<property name="password" value="root"/>
</bean>
<!-- similarly, don't forget the PlatformTransactionManager -->
<bean id="txManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"/>
</bean>
<!-- other <bean/> definitions here -->
然后,我们对org.nutz.dao.impl.NutDao进行必要的修改,把NutDao中的run()方法:
public void run(ConnCallback callback) {
ConnectionHolder ch = Daos.getConnection(getDataSource());
try {
ch.invoke(callback);
}
catch (Throwable e) {
try {
ch.rollback();
}
catch (SQLException e1) {}
if (e instanceof RuntimeException)
throw (RuntimeException) e;
else
throw new RuntimeException(e);
}
finally {
Daos.releaseConnection(ch);
}
}
修改为:
import org.springframework.jdbc.datasource.DataSourceUtils;
public void run(ConnCallback callback) {
Connection con = DataSourceUtils.getConnection(getDataSource());
try {
callback.invoke(con);
} catch (Exception e) {
if (e instanceof RuntimeException)
throw (RuntimeException) e;
else
throw new RuntimeException(e);
} finally {
DataSourceUtils.releaseConnection(con, getDataSource());
}
}
OK,运行一下测试,得到如下日志,事务成功的日志:
2010-04-30 13:12:33,498 [main] DEBUG org.springframework.jdbc.datasource.DataSourceTransactionManager - Creating new transaction with name [cn.zj.pubinfo.nutz.pet.IPetService.createTwoCat]: PROPAGATION_REQUIRED,ISOLATION_DEFAULT
2010-04-30 13:12:33,498 [main] DEBUG org.springframework.jdbc.datasource.DataSourceTransactionManager - Acquired Connection [jdbc:mysql://127.0.0.1:3306/zdtest, UserName=root@localhost, MySQL-AB JDBC Driver] for JDBC transaction
2010-04-30 13:12:33,499 [main] DEBUG org.springframework.jdbc.datasource.DataSourceTransactionManager - Switching JDBC Connection [jdbc:mysql://127.0.0.1:3306/zdtest, UserName=root@localhost, MySQL-AB JDBC Driver] to manual commit
2010-04-30 13:12:33,499 [main] DEBUG org.nutz.dao.impl.NutDao - INSERT INTO t_pet(age,name) VALUES( 0, 'Cat 1')
2010-04-30 13:12:33,500 [main] DEBUG org.nutz.dao.impl.NutDao - SELECT MAX(id) FROM t_pet
2010-04-30 13:12:33,501 [main] DEBUG org.nutz.dao.impl.NutDao - INSERT INTO t_pet(age,name) VALUES( 0, 'Cat 2')
2010-04-30 13:12:33,501 [main] DEBUG org.nutz.dao.impl.NutDao - SELECT MAX(id) FROM t_pet
2010-04-30 13:12:33,502 [main] DEBUG org.springframework.jdbc.datasource.DataSourceTransactionManager - Initiating transaction commit
2010-04-30 13:12:33,502 [main] DEBUG org.springframework.jdbc.datasource.DataSourceTransactionManager - Committing JDBC transaction on Connection [jdbc:mysql://127.0.0.1:3306/zdtest, UserName=root@localhost, MySQL-AB JDBC Driver]
2010-04-30 13:12:33,529 [main] DEBUG org.springframework.jdbc.datasource.DataSourceTransactionManager - Releasing JDBC Connection [jdbc:mysql://127.0.0.1:3306/zdtest, UserName=root@localhost, MySQL-AB JDBC Driver] after transaction
2010-04-30 13:12:33,529 [main] DEBUG org.springframework.jdbc.datasource.DataSourceUtils - Returning JDBC Connection to DataSource
事务失败的日志:
2010-04-30 13:15:17,438 [main] DEBUG org.springframework.jdbc.datasource.DataSourceTransactionManager - Creating new transaction with name [cn.zj.pubinfo.nutz.pet.IPetService.createTwoCat]: PROPAGATION_REQUIRED,ISOLATION_DEFAULT
2010-04-30 13:15:17,439 [main] DEBUG org.springframework.jdbc.datasource.DataSourceTransactionManager - Acquired Connection [jdbc:mysql://127.0.0.1:3306/zdtest, UserName=root@localhost, MySQL-AB JDBC Driver] for JDBC transaction
2010-04-30 13:15:17,439 [main] DEBUG org.springframework.jdbc.datasource.DataSourceTransactionManager - Switching JDBC Connection [jdbc:mysql://127.0.0.1:3306/zdtest, UserName=root@localhost, MySQL-AB JDBC Driver] to manual commit
2010-04-30 13:15:17,440 [main] DEBUG org.nutz.dao.impl.NutDao - INSERT INTO t_pet(age,name) VALUES( 0, 'Cat 1')
2010-04-30 13:15:17,440 [main] DEBUG org.nutz.dao.impl.NutDao - SELECT MAX(id) FROM t_pet
2010-04-30 13:15:17,441 [main] DEBUG org.nutz.dao.impl.NutDao - INSERT INTO t_pet(age,name) VALUES( 0, 'Cat 2')
2010-04-30 13:15:17,442 [main] DEBUG org.nutz.dao.impl.NutDao - SELECT MAX(id) FROM t_pet
2010-04-30 13:15:17,442 [main] DEBUG org.springframework.jdbc.datasource.DataSourceTransactionManager - Initiating transaction rollback
2010-04-30 13:15:17,442 [main] DEBUG org.springframework.jdbc.datasource.DataSourceTransactionManager - Rolling back JDBC transaction on Connection [jdbc:mysql://127.0.0.1:3306/zdtest, UserName=root@localhost, MySQL-AB JDBC Driver]
2010-04-30 13:15:17,465 [main] DEBUG org.springframework.jdbc.datasource.DataSourceTransactionManager - Releasing JDBC Connection [jdbc:mysql://127.0.0.1:3306/zdtest, UserName=root@localhost, MySQL-AB JDBC Driver] after transaction
2010-04-30 13:15:17,465 [main] DEBUG org.springframework.jdbc.datasource.DataSourceUtils - Returning JDBC Connection to DataSource
java.lang.RuntimeException: 测试Nutz DAO和spring集成事务回滚异常
at cn.zj.pubinfo.nutz.pet.PetService.createTwoCat(PetService.java:35)
......
日志表明,并查询了数据库证明,spring声明式事物工作正常。
本人对Nutz的研究还很肤浅,有不正确之处请大家指正。
最后我想说一下对Nutz的感受:虽然很小(代码量少),但是很强大,很灵活。而且Nutz的开发团队非常积极和活跃,相信Nutz会越来越好!
分享到:
相关推荐
https://github.com/nutzam/nutzmore 开源地址下载的速度太慢了,打包做个备份
在做nutz redis集成的实时,由于依赖包的问题被坑了一把,为了后人不要走同样的路,把所有依赖包放在上面了。
你可以组合 Nutz.Dao + Spring 你可以用 Nutz.Ioc 配合 Hibernate Nutz 的任何模块都是可以单独使用的 提供一条更低的且平滑的学习曲线 我尽量让接口的设计简洁且直接 通过用户手册,你可以掌握 Nutz 全部的用法 我...
nutz框架jar包
该框架是一个开源项目,可以免费下载, 集成的DAO,MVC,Spring 等框架的功能 不需要其他jar包 学习容易,好用
活 -- 各个部分可以独立使用,比如在 Spring 里采用 Nutz.Dao ,又比如在 Nutz.Ioc 里使用 Hibernate 等 整 -- 它所有功能均不依赖第三方 jar 文件。 这就意味着:如果一个 Web 应用,你在 WEB-INF/lib 下只 需要...
Spring 里采用 Nutz.Dao ,又比如在 Nutz.Ioc 里使用 Hibernate 等整 -- 它所有功能均不依赖第三方 jar 文件。这就意味着:如果一个 Web 应用,你在 WEB-INF/lib 下只 需要放置一个 nutz.jar 就够了当然你要使用其它...
如果你觉得在多个服务器部署或者修改 Spring 配置文件很麻烦,Nutz.Ioc 专为你设计 如果你觉得直接写 XML 配置文件很麻烦,可视化编辑器又没控制感,Nutz.Mvc 专为你设计 如果你觉得 JSON 转换很麻烦(要写超过一行...
活 -- 各个部分可以独立使用,比如在 Spring 里采用 Nutz.Dao ,又比如在 Nutz.Ioc 里使用 Hibernate 等 整 -- 它所有功能均不依赖第三方 jar 文件。这就意味着:如果一个 Web 应用,你在 WEB-INF/lib 下只 需要放置...
Spring Boot是由Pivotal团队提供的全新框架,其设计目的是用来简化新Spring应用的初始搭建以及开发过程。该框架使用了特定的方式来进行配置,从而使开发人员不再需要定义样板化的配置。通过这种方式,Spring Boot...
Nutz easyui mpsdk4j 七牛云服务微信应用开发项目 1. 实现微信基本的消息互动功能,菜单响应,用户信息同步等 2. 最新的JSSDK功能,如分享,图片上传, 网页授权, 一键关注等 ...
nutz 使用手册 nutz 使用手册 nutz 使用手册 nutz 使用手册 nutz 使用手册 nutz 使用手册 nutz 使用手册 nutz 使用手册 nutz 使用手册 nutz 使用手册 nutz 使用手册
nutz框架用的shiro包,这样就不用下载一大堆shiro其他所需要的包了
dao层使用nutz,view层使用beetl,数据源使用阿里的druid
nutzDao增删改查Demo
用于nutz邮箱验证jar包
nutz生成javabean工具.zip
可连接多种数据库根据表直接生成nutz所需的bean
nutz框架使用手册,从零到有深入学习nutz平台开发
可以快速定位路径 页面 本jar包是nutz实用插件 希望大家多多下载