关注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声明式事物工作正常。
相关推荐
该框架是一个开源项目,可以免费下载, 集成的DAO,MVC,Spring 等框架的功能 不需要其他jar包 学习容易,好用
由于Nutz.Dao完全独立,因此它可以很容易地集成到Spring框架中,只需将其视为一个普通的JavaBean即可。 Nutz的IoC(控制反转)功能是通过Nutz.Ioc实现的,它允许开发者将对象的映射关系存放在数据库或JSON文件中,...
在本项目中,我们主要探讨的是如何将SpringBoot与Nutz和Beetl模板引擎进行集成,同时利用阿里Druid作为数据源。SpringBoot以其简洁的配置和强大的依赖管理,使得快速开发变得更加容易。Nutz是一款优秀的Java ORM框架...
标题提到"Nutz除了SSH框架比较好的框架",这里的SSH指的是Struts、Hibernate和Spring这三大主流Java企业级开发框架的组合。Nutz与SSH相比,它强调的是简洁和实用,主张“零配置”理念,降低了项目的初始化复杂度。 ...
这个框架充分利用了Spring MVC的控制器分发能力,Nutz的DAO层简化数据库操作,以及Apache Shiro的安全框架,打造了一个全面而灵活的基础架构。\n\n在技术栈方面,后台使用了Spring、Spring MVC、Spring Cache、Nutz...
Nutz的ORM模块可以方便地与数据库交互,而DAO模块提供了动态SQL的支持。此外,Nutz还提供了对Web开发的全面支持,包括控制器、模板引擎、HTTP客户端等。Nutz的轻量化和高性能使其成为小型和大型项目的理想选择。 **...
SpringMVC+Nutz框架是一种基于Java的企业级分布式基础开发平台,它结合了Spring MVC和Nutz框架的优势,以及一系列其他成熟的技术,如Apache Shiro、Bootstrap UI等,以实现高效、安全、可扩展的Web应用开发。...
1. Dao层:NutzDao简化了数据库操作,能自动过滤非法字符,支持多数据库兼容,并且可以通过实体类自动生成数据库结构。此外,它还支持动态分表和数据库初始化。 2. Service层:Spring Cache提供了方法级别的缓存,...
SpringMVC与Nutz框架的结合,构建了一种高效、稳定且灵活的企业级分布式开发平台。该框架融合了众多成熟的技术,旨在提升开发效率,实现各种企业应用场景,如组织机构管理、权限授权、数据权限、内容管理以及微信...
10. **持续集成与部署**: 支持持续集成工具如Jenkins、GitLab CI/CD,以及Docker容器化部署,适应现代化的开发流程。 总的来说,NutzWk企业级开发框架v5.6.0是一个为企业级应用量身定制的解决方案,它以简洁、...
1. Shiro框架,学习Subject、SecurityManager和Realms,以及与Spring和Nutz的集成。 2. JasperReport报表,了解可视化定义和编程使用。 3. Redis数据库的使用,了解NoSQL数据库的优势。 4. 明白SpringBoot的微服务...
而 Nutz 是一个轻量级的框架,它提供了 ORM(对象关系映射)、DAO(数据访问对象)以及一系列实用工具,简化了 Java 开发过程。 这个框架组合,SpringMVC+Nutz,是一个企业级分布式基础开发平台,它整合了多种技术...