实践篇(3)--关于事务处理的一点细节
2005-12-13 21:58
387 查看
很早就注意到了微软的MTS COM+,但是却很少使用,主要原因是因为它的第一次执行太慢,耗费的资源比较多。在服务器配置比较乐观的项目里,比如某移动公司和某知名跨国日化生产商的系统里,恰当地使用COM+反而使得整体负载和程序的框架变得很清晰。
在castle中集成了NHibernateIntegration对NHibernate进行了集成,对Session和Transaction进行了很好的封装。但是在对发布的beta版进行了最基本的测试后,我发现这个开源的东西还比较简陋。于是通过SVN获取了最新的开发版本,发现已经完全重写了。所以我就一个经典的转账来看看他们各有怎样的表现.
测试场景:
我们假设一个娱乐中心要通过银行把钱转给在本中心娱乐的那些玩家中的获奖者,娱乐中心的账号设在bank1;而获奖者的账号都在bank2. 以下是转账的规则:
1) 娱乐中心没有钱肯定不能转帐;
2) 一次转账额不能超过5000;
3) 银行账号不能有重复;
在很多的经典例子中,都太简单,这里我们模拟在每次都转到新开账号上,如果对第二次转帐到同一玩家,您讲看到一个异常。我们看看这两个容器是否能经受考验!
以下就是针对COM+ 的程序片断:
using System;
using System.Data;
using System.Reflection;
using System.EnterpriseServices;
using System.Runtime.InteropServices;
using Dao;
[assembly: ApplicationName("COM+ demo")]
[assembly: ApplicationActivation(ActivationOption.Library)]
using System;
using System.Collections;
using Demo.Entities;
using Castle.Services.Transaction;
using Castle.Facilities.NHibernateIntegration;
using NHibernate;
using NHibernate.Expression;
而上层的服务代码如下:
using System;
using System.Collections;
using Demo.Entities;
using NHibernate;
using Castle.MicroKernel;
using Castle.Services.Transaction;
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<facilities>
<facility id="nhibernate">
<!-- 数据库一 -->
<factory id="demo1">
<settings>
<item key="hibernate.connection.provider">NHibernate.Connection.DriverConnectionProvider</item>
<item key="hibernate.connection.driver_class">NHibernate.Driver.SqlClientDriver</item>
<item key="hibernate.connection.connection_string">Server=localhost;Database=demo1;Uid=sa;Pwd=</item>
<item key="hibernate.dialect">NHibernate.Dialect.MsSql2000Dialect</item>
</settings>
<resources>
<resource name="./Account.hbm.xml" />
</resources>
</factory>
<!-- 数据库二 -->
<factory id="demo2" alias="db2">
<settings>
<item key="hibernate.connection.provider">NHibernate.Connection.DriverConnectionProvider</item>
<item key="hibernate.connection.driver_class">NHibernate.Driver.SqlClientDriver</item>
<item key="hibernate.connection.connection_string">Server=localhost;Database=demo2;Uid=sa;Pwd=</item>
<item key="hibernate.dialect">NHibernate.Dialect.MsSql2000Dialect</item>
</settings>
<resources>
<resource name="./Account.hbm.xml" />
</resources>
</factory>
</facility>
</facilities>
<components>
<component id="bank2" >
<parameters>
<DbTag>db2</DbTag>
</parameters>
</component>
</components>
</configuration>
通过改造NHibernateIntegration,我们可以在输出窗口看到执行过程:
1) 启动Transfer事务;
2) 启动Withdraw事务;
3) 完成Withdraw处理;
4) 启动CrateNewAccount处理;
5) 完成CrateNewAccount处理;
6) 对bank1和bank2进行数据库事务提交;
7) 完成Transfer事务;
结论:
首次执行COM+明显慢一些;
COM+的逻辑没有发生混乱;而NHibernateIntegration在没有及时进行缓存刷新时发生了严重的逻辑错误并且不能回滚。
另外我在一些有递归的情况下进行测试发现:使用延迟加载会出现session closed 或者访问空值得异常情况。
让我们期待NHibernateIntegration的完善吧......
alex
在castle中集成了NHibernateIntegration对NHibernate进行了集成,对Session和Transaction进行了很好的封装。但是在对发布的beta版进行了最基本的测试后,我发现这个开源的东西还比较简陋。于是通过SVN获取了最新的开发版本,发现已经完全重写了。所以我就一个经典的转账来看看他们各有怎样的表现.
测试场景:
我们假设一个娱乐中心要通过银行把钱转给在本中心娱乐的那些玩家中的获奖者,娱乐中心的账号设在bank1;而获奖者的账号都在bank2. 以下是转账的规则:
1) 娱乐中心没有钱肯定不能转帐;
2) 一次转账额不能超过5000;
3) 银行账号不能有重复;
在很多的经典例子中,都太简单,这里我们模拟在每次都转到新开账号上,如果对第二次转帐到同一玩家,您讲看到一个异常。我们看看这两个容器是否能经受考验!
以下就是针对COM+ 的程序片断:
using System;
using System.Data;
using System.Reflection;
using System.EnterpriseServices;
using System.Runtime.InteropServices;
using Dao;
[assembly: ApplicationName("COM+ demo")]
[assembly: ApplicationActivation(ActivationOption.Library)]
using System;
using System.Collections;
using Demo.Entities;
using Castle.Services.Transaction;
using Castle.Facilities.NHibernateIntegration;
using NHibernate;
using NHibernate.Expression;
而上层的服务代码如下:
using System;
using System.Collections;
using Demo.Entities;
using NHibernate;
using Castle.MicroKernel;
using Castle.Services.Transaction;
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<facilities>
<facility id="nhibernate">
<!-- 数据库一 -->
<factory id="demo1">
<settings>
<item key="hibernate.connection.provider">NHibernate.Connection.DriverConnectionProvider</item>
<item key="hibernate.connection.driver_class">NHibernate.Driver.SqlClientDriver</item>
<item key="hibernate.connection.connection_string">Server=localhost;Database=demo1;Uid=sa;Pwd=</item>
<item key="hibernate.dialect">NHibernate.Dialect.MsSql2000Dialect</item>
</settings>
<resources>
<resource name="./Account.hbm.xml" />
</resources>
</factory>
<!-- 数据库二 -->
<factory id="demo2" alias="db2">
<settings>
<item key="hibernate.connection.provider">NHibernate.Connection.DriverConnectionProvider</item>
<item key="hibernate.connection.driver_class">NHibernate.Driver.SqlClientDriver</item>
<item key="hibernate.connection.connection_string">Server=localhost;Database=demo2;Uid=sa;Pwd=</item>
<item key="hibernate.dialect">NHibernate.Dialect.MsSql2000Dialect</item>
</settings>
<resources>
<resource name="./Account.hbm.xml" />
</resources>
</factory>
</facility>
</facilities>
<components>
<component id="bank2" >
<parameters>
<DbTag>db2</DbTag>
</parameters>
</component>
</components>
</configuration>
通过改造NHibernateIntegration,我们可以在输出窗口看到执行过程:
1) 启动Transfer事务;
2) 启动Withdraw事务;
3) 完成Withdraw处理;
4) 启动CrateNewAccount处理;
5) 完成CrateNewAccount处理;
6) 对bank1和bank2进行数据库事务提交;
7) 完成Transfer事务;
结论:
首次执行COM+明显慢一些;
COM+的逻辑没有发生混乱;而NHibernateIntegration在没有及时进行缓存刷新时发生了严重的逻辑错误并且不能回滚。
另外我在一些有递归的情况下进行测试发现:使用延迟加载会出现session closed 或者访问空值得异常情况。
让我们期待NHibernateIntegration的完善吧......
alex
相关文章推荐
- 实践篇(3)--关于事务处理的一点细节
- 关于触发器一点问题(事务处理中)
- 关于Spring4+Hibernate4架构升级-整合的细节处理-由nested transactions not supported错误解决引申到事务嵌套问题处理
- 【任务笔记】关于EMC DMX-4系列数据处理的一点心得
- 关于QString转换为char*的一点小细节
- C#.NET执行Oracle DBLink关于“ORA-02041: 客户数据库未开始一个事务处理”
- 关于blackberry平台下sqlite事务的处理方式
- tinkphp3.2.3 关于事务处理。
- 编程中关于异常处理的10个最佳实践
- 关于MySQL的事务处理及隔离级别
- 关于Oracle处理DDL和DML语句的事务管理
- MySQLi面向对象实践---事务处理
- 关于对CDR处理的一点感悟(存储过程)
- 关于“ORA-02041: 客户数据库未开始一个事务处理”
- 4、Spring中关于事务的处理
- 关于spring声明式事务管理异常处理的测试和小结
- 解析关于SQL语句Count的一点细节
- 关于spring事务处理,service层方法上加锁数据没有更新
- 讨论:关于SSH三层框架中的事务处理
- Silverlight表格绑定中的一点细节处理