使用持久层框架
当然,iBATIS不能实现高层开发和维护SQL语句,而且缺乏可移植性。为了避免这类问题,你需要用到持久层框架。持久层框架可以将对象域映射到数据库中。它提供了创建,查找,删除对象的API函数。当程序要控制对象时它可以自动的加载相应的对象,还可以在事务处理结束时自动更新数据库。持久层框架通过对象/关系映射机制可以自动的生成SQL语句,对象/关系映射机制用XML文档定义了怎样将类映射为表,怎样将数据映射为列(column)和关系是怎样被映射为外键与连接表的。
在持久层构架上EJB也有它的短处:实体bean.EJB2的实体bean有很多的不足,而且开发和测试它会变得非常的枯燥。最后,很少用EJB2的实体bean了。在EJB3中会说明那些问题。
两种最有流行的轻量级持久层构架是JDO和Hibernate,前者是Sun的标准框架,后者是开源工程。两种框架都可以为POJO类提供持久层事务处理。你可以用POJO类来开发和测试你的业务逻辑,而不用担心持久层的问题,这个时候它会将类映射到数据库中的schema.另外,他们两个都可以在服务器程序外部或者内部,这样可以进一步降低开发难度。用Hibernate和JDO来进行开发比用老的EJB2的实体bean要舒服的多。
除了要决定怎样访问数据库外,还要决定如何处理数据库的并行处理问题。下面来看一下,为什么并行处理问题那么重要,同时看一下可实现的选项
决策4:处理数据库事务处理的并行问题
差不多所有的企业应用程序都需要多用户和多个后台进程并行的更新数据库。2个数据库 处理事务同时访问同时访问同一个数据是很正常的,但是这种情况很可能引起数据库中的数据不一致或者引起应用程序的不正常。由于大部分的应用程序都需要处理多个处理事务并行访问同一个数据,则它可以影响到业务和持久层的设计。
无论你是使用EJB还是轻量级构架,你的程序必须可以并行访问共享数据。EJB2要求使用供应商提供的特殊扩充接口来实现并行,然而与此不同的是,JDO和Hibernate可以直接支持大部分并行机制。更重要的是,使用JDO和Hibernate不仅只配置简单,而且只需要少量的代码就可以实现了。
在这样主要介绍几种“并行更新数据库处理事务”的选项的概要,这些事务处理和用户的输入无关。下一章,我主要介绍一下如何在应用程序级长时间的并行更新数据库处理事务,这种处理事务会与用户输入有关,而且是由一系列的数据库事务处理组成的。
独立数据库事务
有时候对共享数据的并行访问可以简单的依靠数据库本身来实现,数据库可以设置为执行孤立的数据——这只是对数据库而言。如果你对这种概念不熟悉也不要担心,你只要记住:如果应用程序使用完全的孤立事务方式,那么同时执行2个事务的结果和一个接一个的执行是一样的。(也就是说,如果你用孤立事务的方式来访问数据库的话,你同时执行2个事务,就会变成一个接一个的串行执行了。)
这种方法也许听起来非常的简单,但问题是这种处理方式有时候会降低性能,因为如何实现对事务的孤立是由数据库来决定的。为了这个原因,许多应用程序都避免使用它,而采用optimistic或者pessimistic 所锁,这会在下面讲到。
开放式锁定
并行更新数据的一种途径是用开放式锁定。开放式锁定工作原理是通过应用程序来检查数据是否被更新(被其他事务修改造成的)而实现的。一种更普通的实现开放式锁定的方法是在每个表中添加一个“版本列”(version column),对每个表而言,程序每次改变其中一行的时候都会更新这个“版本列”。每个UPDATE语句中的WHERE语句会根据上次查询的结果判断这个版本号是不是被更改了。在事务访问数据库中的数据时,程序中可以用PreparedStatement.executeUpadte()这个函数的返回值来检查行的个数,从而判断是否要继续执行UPDATE语句。如果数据中的行已经被其他的事务更新或者删除了,那么程序会让该事务从新访问数据库。
用开放式锁定机制来锁定那些直接执行SQL语句的应用程序是非常简单的。但是,用持久层构架(比如JDO和Hibernate)实现更容易,因为他们已经提供了开放式锁定机制——在配置选项中。一旦在配置选项中,选中了这种方式,持久层构架会自动的生成SQL的UPDATE语句来完成版本检查的任务。开放式锁定的名字来源于一种假设的情况,在这种情况下:并发更新的机会非常少,而且程序只能检测、覆盖这些数据而不能防止这种事情的发生。另外一种可选的途径是用保守式锁定,使用他的假设条件是:并发更新肯定会发生,而且必须被禁止。
文章来源于领测软件测试网 https://www.ltesting.net/