思路话语

。Arlen:思想有多远你就能走多远...

基于castle集成 自动事务 数据访问(IBatisNet SqlMap) 以及Log4Net

以前看了园子里的这位朋友的文章及下载了他的演示代码(文档管理系统),一直对其中一点感到疑惑:他把各个业务层的类(Service)都抽象出了一个个的接口,并且放到容器里管理起来。有这个必要吗?这不是简单事情复杂化吗?原文地址:http://www.cnblogs.com/pw/archive/2007/02/06/642479.aspx

今天自己做项目时,特意一点一点去加。我没有做持久层,而是直接写业务层,在业务层中取容器中的ISqlMapper对数据库进行操作,然后web层中直接new业务层中的业务逻辑类,进行调用。

先是通过IBatisNet Facility加SqlMap ,然后是通过LogFacility加Log4Net,都非常顺利。最后在添加自动事务管理的这个Facility之后,发现自动事务不起作用了。

这两天在空闲时间里,一直琢磨这个事,不断的尝试,今天终于让我找到了原因。

如果业务类需要自动事务管理,必须满足如下条件:

1.必须把业务类交由容器管理。(可以不抽象出接口,而由程序根据组件id从容器中获取。总之,必须将业务类交给容器管理)

2.业务类的声明必须是这样:

[Transactional]
[UsesAutomaticSessionCreation]

如果只标为[Transactional],自动事务将不会起作用。

有日志为证:

只加[Transactional]:

DEBUG 2009-02-25 13:09:24,156 Castle.Facilities.IBatisNetIntegration.DataMapperTransactionManager -Transaction 63390755 created
DEBUG 2009-02-25 13:09:24,156 Castle.Facilities.IBatisNetIntegration.DataMapperTransactionManager.Castle.Services.Transaction.StandardTransaction -Transaction 63390755 Begin
DEBUG 2009-02-25 13:09:26,906 Castle.Facilities.IBatisNetIntegration.DataMapperTransactionManager.Castle.Services.Transaction.StandardTransaction -Transaction 63390755 Rollback
DEBUG 2009-02-25 13:09:26,921 Castle.Facilities.IBatisNetIntegration.DataMapperTransactionManager -Transaction 63390755 disposed successfully

 

标为

[Transactional]
[UsesAutomaticSessionCreation]之后,日志如下:

DEBUG 2009-02-25 13:15:38,015 Castle.Facilities.IBatisNetIntegration.DataMapperTransactionManager -Transaction 44169412 created
DEBUG 2009-02-25 13:15:38,015 Castle.Facilities.IBatisNetIntegration.DataMapperTransactionManager.Castle.Services.Transaction.StandardTransaction -Transaction 44169412 Begin
DEBUG 2009-02-25 13:15:38,031 Castle.Facilities.IBatisNetIntegration.DataMapperTransactionManager.Castle.Services.Transaction.StandardTransaction -Enlisting resource Castle.Facilities.IBatisNetIntegration.ResourceSqlMapAdapter
DEBUG 2009-02-25 13:15:38,031 Castle.Facilities.IBatisNetIntegration.DataMapperTransactionManager.Castle.Services.Transaction.StandardTransaction -Resource enlisted successfully Castle.Facilities.IBatisNetIntegration.ResourceSqlMapAdapter
DEBUG 2009-02-25 13:15:38,031 Castle.Facilities.IBatisNetIntegration.DataMapperTransactionManager.Castle.Services.Transaction.StandardTransaction -Registering Synchronization Castle.Facilities.IBatisNetIntegration.SqlMapKeeper
DEBUG 2009-02-25 13:15:38,031 Castle.Facilities.IBatisNetIntegration.DataMapperTransactionManager.Castle.Services.Transaction.StandardTransaction -Synchronization registered successfully Castle.Facilities.IBatisNetIntegration.SqlMapKeeper
DEBUG 2009-02-25 13:15:41,093 Castle.Facilities.IBatisNetIntegration.DataMapperTransactionManager.Castle.Services.Transaction.StandardTransaction -Transaction 44169412 Rollback

对比一下日志,就可以看出,只有加上后一个标志之后,事务才会将IBatisNet的SqlMapper管理起来。

 演示代码:

Castle集成IBatisNet(SqlMapper)/Log4Net/自动事务 

 

posted on 2009-02-25 13:44  Arlen  阅读(952)  评论(1)    收藏  举报

导航