类型:办公软件大小:35KB语言:中文评分:1.2标签:立即下载问题:
1.当业务逻辑与数据库分离时,如何确保每个方法访问最合适的数据(不会导致数据库中的海量数据查询)
2.当业务逻辑和数据库分离时,如何处理事务
在三层结构下,数据访问层与业务逻辑分离。从对象关系的角度来看,业务逻辑层的对象依赖于数据访问层。那个。net平台提供ado.net操作数据库,连接对象提供连接和事务数据库的功能。在分层结构下,数据访问层处理数据库的操作,实现了对每个对象和数据库进行分域的方法。例如,客户对象提供了客户道等方法。add(),customerdao。更新(),等。每个方法将引用一个独立的连接对象。业务层直接调用CustomerDAO的方法。连接对象与业务层处于关闭状态,业务层无法访问和控制ado.net提供的交易。通常有三种方法可以在不破坏分层架构的情况下实现这一点。System.Transaction:net提供的简单解决方案。系统。事务允许对本地和分布式数据库进行操作。使用系统。不考虑一个或多个连接、一个或多个数据库的事务。例如,您可以使用TransactionScope。例如,下面的代码非常直观。使用(TransactionScope作用域=new transaction scope()){ SqlConnection connection 1=new SqlConnection(connect string 1)SqlConnection connection 2=new SqlConnection(connect string 2)作用域。完成();}有两个连接,连接,系统。事务将被集成到一个Transaction中,所以我们只需要在业务层需要事务的地方使用TransactionScope,非常方便。虽然方便,但还是有缺点。因为系统。交易会自动监控连接,如果只有一个连接,会直接使用ado.net的交易,完善不会影响。但是,如果上述代码中有两个以上的连接,则系统。事务将自动升级到分布式级别,这样性能就会打折扣。对于除sqlserver之外的其他一些数据库,例如oracle,它总是分布式的。这种方法只适用于性能要求低的项目。将连接/事务参数传递给DAO:的思想是,DAO的每个对象都需要提供一个参数来接受是否需要事务的信息。例如,您可以自定义一个MyTrans类,它引用一个连接对象。公共类MyTrans { public IConnection connection;public void Begin nos();public void commitTrans();}这样的包装类可以使业务层对象在连接上间接操作,例如业务层类customer。Update()可以通过这种方式实现。使用(MyTrans tran=new MyTrans){ tran . begin nos();CustomerDAO dao=新customer Dao(tran);刀。add();tran.committrans();}有了这个实现,开发的复杂性会增加。DAO需要每个类实现一个接受Trans的参数。这种方法适合有足够时间,想亲自操作数据库的项目。Transaction:的AOP实现可以参考Spring提供的AOP机制和Transaction,Aop Spring。AOP的内部实现采用反射原理,利用Typebuilder对Class的方法进行重新排列,使得Connection的事务操作可以自动加入到逻辑层的对象方法中。Spring提供了一种申报方式,非常方便快捷,性能不受Ado.net影响。比如下面的代码,只要简单的声明一下就可以了。公共类TestObjectManager : ITestObjectManager {//字段/属性commended[Transaction()]public void savetowtestobjects(TestObject to 1,TestObject to2){TestObjectDao。创建(to1。姓名,to1。年龄);TestObjectDao。创建(to2。姓名,to1。年龄);}[Transaction()]public void deletetwostobjects(字符串名1,字符串名2){TestObjectDao。删除(名称1);TestObjectDao。删除(名称2);}}这种方法适用于需要快速开发、项目决策者愿意使用工具的大型项目。
3.Spring.net应用于事务处理,PLSQL控制应用于查询和报告。