2022年SSH开发新实施方案书之基于SSH开发架构的重新分层.docx
《2022年SSH开发新实施方案书之基于SSH开发架构的重新分层.docx》由会员分享,可在线阅读,更多相关《2022年SSH开发新实施方案书之基于SSH开发架构的重新分层.docx(23页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、SSH 开发新方案之基于 SSH 开发架构的重新分层现代的企业开发中,越来越多地引入了多层架构设计模式;Struts+Spring+Hibernate 一下简称为 SSH就是其中之一, SSH 架构是当前特别火的架构,许多金融、电信工程,大型门户网站均挑选该架构作为业务支撑架构,开发流程也已经特别成熟;但是该结构开发起来,照旧存在一些问题;分析这些问题,得先从SSH 架构的组成说起;SSH 为 Struts+Spring+Hibernate 的组成方式, Struts 实现 MVC ,Spring 负责架构的结合, Hibernate 进行数据的长久化;通常其分层开发的结构图 以一个业务新增为
2、例如下:这样的结构,满意了一般的业务需要,但是对于当前日益复杂化的WEB2.0 的开发,却存在不少问题,归纳起来主要有以下几点的不足:ADAO 和服务层简洁显现职责不明,由于根据MVC 规律,业务代码应当写在Struts Action 里,但是其事务的供应,却是配置在 Service 层;为了一组在规律上完整的数据操作业务规律,需要涉及两个层 当需要返回的数据供AJAX 使用,操作 JSON 或 XML 的的大量使用时;开发起来会很费劲,一段同样的业务代码,为了使用 AJAX 和 XML 可能需要重新编写一次,或者在同一个ACTION 里通过标志来判定,对分层结构造成了比较糟糕的破坏;假如设计
3、得不好,为了使用JSON 和 XML 仍得额外增加大量的配置,严峻降低了开发效率;因此,为了克服这些缺点,本人对于SSH架构,进行了实现了重新的分层,共享了业务代码;简化了开发、增强了与23 / 19AJAX 技术、 MXL 技术的结合;供应了一种更高效的开发模式;其开发的结构图如下:看到这个架构图有人可能会问,Struts Action 类的编写去哪了呢?答案正是这个架构的优点,由于业务代码统一实现IbusinessService 接口,使得只需要相对固定的几个Struts Action 类调用 Service 层的方法,便可以完成工作;包括JSON 格式输出, XML 输出及 WebSer
4、vice 输出均调用 Service 层方法来完胜利能;这样便实现了业务代码的分别,以及与前端框架的极大解耦;结合 spring+hibernate与 jdbc的事务问题背景 :我们是一家工作流公司,客户选购我们的产品后,将其嵌入其工程中;我们的工作流采纳的是 spring+hibernate的方式,客户工程就是 jdbc 直接进行数据库操作;问题 :客户在其数据库操作过程中需要调用我们的工作流接口,这样就需要将我们的工作流操作与他们的业务操作置于同一个事务中;我们的服务采纳的都是spring的声明式事务,而客户采纳的是对connection进行事务处理;如何保证事务的一样性?想到的解决方案一
5、 :使用 jta事务,用 tomcat+jotm供应事务治理器;为什么一开头就想到要使用 jta事务?实际上我们和客户都是使用的同一个数据库,为了便利,各自使用了不同的数据库连接方式,使用jta的话的确有 bt 的意思在里面;但是事实上是我们的第一反应都是jta ;最终没有采纳该方法的缘由也很简洁:我没有将jotm配置胜利!汗一个;想到的解决方案二 :将客户的这些特定代码用spring治理起来;由于要修改客户部分代码, 这个方案遭到了客户的剧烈反对;于是舍弃;想到的解决方案三 :客户数据库操作与我们的服务使用同一个数据库连接;然后编程处理事务;存在两种方式:一种是把客户的连接传给我们,另一种就
6、是把我们的连接传给客户;第一种方式对我们的影响太大,所以最终打算采纳后一种方式:从hibernate session中猎取 connection然后传递给客户;接下来查看一下HibernateTemplate的 execute方法,思路就很简洁了:猎取定义的sessionFactory-创建一个新的 session并打开 -将 session与当前线程绑定 -给客户代码返回connection-打开事务 -客户使用我们传递的connection 进行数据库操作-我们不带声明事务的服务操作-提交事务 -解除绑定;实际要留意的地方是: 1 、将 session与当前线程绑定使用的Transacti
7、onSynchronization Manager.bindResource方法,这样在 HibernateTemplate里才能找到session;2 、我们的服务肯定要把声明式事务完全干掉,否就会有commit;3 、我们服务调用完毕后肯定要flush session,否就客户代码不会感知数据库里的数据变化;最终解决:使用了spring里常用的模板和回调;代码如下:publicclassTransactionTemplate protectedfinalLog logger = LogFactory.getLogTransactionTemplate.class ;privateFlush
8、Mode flushMode = FlushMode.ALWAYS;publicObject executeTransactionCallback callback / 第一猎取 sessionFactorySessionFactory sessionFactory = SessionFactory Framework.getEngine.getContainer.getComponentsessionFactory;/ 创建一个新的 session并打开logger.debugOpening single Hibernate Session in TransactionTemplate ;S
9、ession session = getSessionsessionFactory;/ 将 session与当前线程绑定TransactionSynchronizationManager.bindResourcesessionFactory,newSess ionHoldersession;/ 猎取数据库连接Connection conn = session.connection;Object result =null ;Transaction transaction =null ;try/ 开头处理事务transaction = session.beginTransaction;tryres
10、ult = callback.doInTransactionconn;catchRuntimeException ex doRollbacksession, transaction;throwex ;catchError err doRollbacksession, transaction;throwerr ;/ 假如数据库操作过程中没有发生反常就提交事务mit;catchWorkflowException e logger.error数据库操作失败,事务回滚也失败! ;throwe ;catchRuntimeException ex logger.error数据库操作失败,事务被回滚! ;t
11、hrowex ;catchError err logger.error数据库操作失败,事务被回滚! ;throwerr ;finally/将 session与当前线程解除绑定TransactionSynchronizationManager.unbindResourcesessionFactory;doClosesession;returnresult;protectedSession getSessionSessionFactory sessionFactory Session session = SessionFactoryUtils.getSessionsessionFactory,tr
12、ue ;FlushMode flushMode = getFlushMode;if flushMode .=null session.setFlushModeflushMode;returnsession;privatevoiddoRollbackSession session, Transaction transaction logger.debug数据库操作反常,开头回滚事务 ;trytransaction.rollback;logger.debug回滚事务胜利! ;catchException e logger.error回滚事务失败! ;thrownewWorkflowExceptio
13、n回滚事务失败! ;finally session.clear;privatevoiddoCloseSession session logger.debug开头关闭连接 ;trysession.close;catchException e logger.error关闭连接失败! ;thrownewWorkflowException关闭连接失败! ;publicFlushMode getFlushMode returnflushMode;publicvoidsetFlushModeFlushMode flushMode this .flushMode = flushMode; b5E2RGbCA
14、PpublicinterfaceTransactionCallback Object doInTransactionConnection conn; p1EanqFDPw调用伪代码:publicvoidmethodATransactionTemplate transactionTemplate=newTransactionTemplate;transactionTemplate.executenewTransactionCallback publicObject doInTransactionConnection conn / 客户代码client.method11;/ 我们代码 直接使用ou
15、r.method2;/ 客户代码client.method3l;returnnull ;荣浩原创,转载请注明出处:)DXDiTa9E3dposted on 2007-10-09 15:11ronghao阅读 5090评论 5编辑 保藏 所属分类 :工作日志 RTCrpUDGiT高并发测试下的一些问题及解决测试在 sqlserver2000上进行,对工作流操作的相关方法在单元测试里进行多线程并发;测试发觉 sqlserver显现死锁的情形相当多,一些典型的情形:1 、对同一张表先insert再 update是很快会引起死锁的,不管操作的是否是同一记录解决方法:对于同一记录,需要调整hiberna
16、te的映射策略,使得一次insert完成操作;对于不同的记录需要在代码中手动flush,使得 update先于 insert;2 、对两张表进行多次update操作时,两张表交替update也会很快引起死锁解决方法:在代码中手动flush ,保证对两张表的update不会显现交替的情形;3 、部分大范畴扫描的select和 update混合也会导致死锁解决方法:优化sql ,尽量削减 sql 语句,通过给 po 增加长久化字段的方式削减关联查询经过优化,大部分情形下数据库死锁的情形得以防止,另外古怪的是通过大事探查器在死锁时并未发觉锁升级的大事;但是在一些特别情形下 例如多个并发汇聚的直接联合
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 2022 SSH 开发 实施方案 基于 架构 重新 分层
限制150内