??xml version="1.0" encoding="utf-8" standalone="yes"?>
Controller
ControlServlet?a >Front ControllerQ?
接收所有的hQ是h的入口,执行一些的预备处理后,交由RequestHandlerd理实际的h工作QView层的处理交给
ViewHandlerq行处理QViewHandler有很多实现类Q还可以自定义,可以集成很多面层显C技术,如JSP和FreeMarker{,
处理程如下图所C:
MVC的解耦的地方是通过controller.xml配置文g实现的,配置文g如下所C:
request-map的response元素有一个属性nameQ这个name理论上可以Q意选取Q不qOFBiz内置了success? errorq两个|q类gStruts 2。属性type如果是view表示得到一个页面,value值对于view-map中的name属性倹{之所以不直接写上面Q而是增加view- mapQ一是ؓ了解耦,二是针对不同的viewQ可以设|不同的type{属性。type属性很关键Q正是这个属性帮助OFBiz集成不同的显C层技术? common-controller定义了不同的type和其对应的ViewHandlerQ?/p>
q里的name对应view map中的type。实现解耦的cM是Front Controller而是RequestHandlerQ请求代理类Q在q里负责dcontroller.xml文g中的对应关系Q根据Front Controller发送过来的hQ选择相应的业务动作进行业务更斎ͼq且选择相应的视图View去解析ƈ展示。在Service to Worker模式中,RequestHandlercȝ角色是Dispatcher?br />
1.q时׃字符~码不一致导致的Q应该将数据库对应的表或coloumҎuft-8Q所以如果在CustomerExtraq表中存储中文的话,需要将
此表另外q有operationlog表的charsetҎutf-8
2.Servlet中字W显CZؓ证券的中文,而且表也讄为utf-8Q但是数据库和页面还是ؕ码,怎么回事Q?br />
q里需要修改jdbc url的参敎ͼ如将jdbc:mysql://localhost/ccbportal?zeroDateTimeBehavior=convertToNull
ҎQjdbc:mysql://localhost/ccbportal?zeroDateTimeBehavior=convertToNull&useUnicode=true&characterEncoding=UTF-8
3.前台输入的是中文Q到后台变成了qQ怎么回事Q?br />
无论何种表单提交都可以在后台的java文g中通过String des = new String(s.getBytes("iso8859-1"),"UTF-8");
来{换成你想要的UTFQ?~码方式。但如果每处都加词句太麻烦,故分post和get两种方式区分提交?br />
写一个Filter卛_解决问题Q?br />
web.xmld此FilterQ?br />
所谓全局事务Q是指分布式事务处理环境中,多个数据库可能需要共同完成一个工作,q个工作x一个全局事务Q例如,一个事务中可能更新几个不同的数据库。对
数据库的操作发生在系l的各处但必d部被提交或回滚。此时一个数据库对自己内部所做操作的提交不仅依赖本n操作是否成功Q还要依赖与全局事务相关的其?
数据库的操作是否成功Q如果Q一数据库的M操作p|Q则参与此事务的所有数据库所做的所有操作都必须回滚?/span>
一般情况下Q某一数据库无法知道其它数据库在做什么,因此Q在一?span style="font-family: "Courier New";"> DTP 环境中,交易中间件是必需的,由它通知和协调相x据库的提交或回滚。而一个数据库只将其自己所做的操作Q可恢复Q媄到全局事务中?/span>
XA 是 X/Open DTP 定义的交易中间g与数据库之间的接口规范(x口函敎ͼQ交易中间g用它来通知数据库事务的开始、结束以及提交、回滚等?span style="font-family: "Courier New";"> XA 接口函数由数据库厂商提供?/span>XA 与两阶段提交协议
通常情况下,交易中间件与数据库通过 XA 接口规范Q用两阶段提交来完成一个全局事务Q?span style="font-family: "Courier New";"> XA 规范的基是两阶段提交协议?/span>
在第一阶段Q交易中间gh所有相x据库准备提交Q预提交Q各自的事务分支Q以认是否所有相x据库都可以提交各自的事务分支。当某一数据库收到预
提交后,如果可以提交属于自己的事务分支,则将自己在该事务分支中所做的操作固定记录下来Qƈl交易中间g一个同意提交的应答Q此时数据库不能再在该?
务分支中加入M操作Q但此时数据库ƈ没有真正提交该事务,数据库对׃n资源的操作还未释放(处于上锁状态)。如果由于某U原因数据库无法提交属于自己?
事务分支Q它回滚自q所有操作,释放对共享资源上的锁Qƈq回l交易中间gp|应答?/span>在第二阶D,交易中间件审查所有数据库q回的预提交l果Q如所有数据库都可以提交,交易中间件将要求所有数据库做正式提交,q样该全局事务被提交。而如果有M数据库预提交q回p|Q交易中间g要求所有其它数据库回滚其操作,q样该全局事务被回滚?/span>
以一个全局事务ZQ?span style="font-family: "Courier New";"> AP 首先通知交易中间件开始一个全局事务Q交易中间g通过 XA 接口函数通知数据库开始事务,然后 AP 可以Ҏ据库理的资源进行操作,数据库系l记录事务对本地资源的所有操作。操作完成后交易中间仉过 XA 接口函数通知数据库操作完成。交易中间g负责记录 AP 操作q哪些数据库Q事务分支)?span style="font-family: "Courier New";"> AP Ҏ情况通知交易中间件提交该全局事务Q交易中间g会通过 XA 接口函数要求各个数据库做预提交,所有数据库q回成功后要求各个数据库做正式提交,此时一W全局事务l束?/span>
XA 规范对应用来_最大好处在于事务的完整性由交易中间件和数据库通过 XA 接口控制Q?span style="font-family: "Courier New";"> AP 只需要关注与数据库的应用逻辑的处理,而无需q多兛_事务的完整性,应用设计开发会化很多?/span>
具体来说Q如果没有交易中间gQ应用系l需要在E序内部直接通知数据库开始、结束和提交事务Q当出现异常情况时必ȝ专门的程序对数据库进行反向操作才能完成回滚。如果是有很多事务分支的全局事务Q回滚时情况变得异常复杂。而?span style="font-family: "Courier New";"> XA 接口Q则全局事务的提交是׃易中间g控制Q应用程序只需通知交易中间件提交或回滚事务Q就可以控制整个事务Q可能涉及多个异地的数据库)的全部提交或回滚Q应用程序完全不用考虑冲正逻辑?/span>
在一个涉及多个数据库的全局事务中,Z证全局事务的完整性,׃易中间g控制数据库做两阶D|交是必要的。但典型的两阶段提交Q对数据库来说事务从开
始到l束Q提交或回滚Q时间相对较长,在事务处理期间数据库使用的资源(如逻辑日志、各U锁Q,直到事务l束时才会释放。因此,使用典型的两阶段提交相对
来说会占用更多的资源Q在|络条g不是很好Q如低速网、网l颠RJ,情况会更Z重?/span>
当一个全局事务只涉及一个数据库Ӟ有一U优化方式,即一阶段提交。当 AP 通知交易中间件提交事务时Q交易中间g直接要求数据库提交事务,省去两阶D|交中的第一阶段Q可以羃短处理一个事务的旉Q以提高事务处理的效率。作Z阶段提交的一U特例,与两阶段一P一阶段提交也是标准的?/span>
XA的要?/strong>
对于jms来说Q需要配|支持XA?connection factory.
对于db来说Q需使用支持XA的JDBC driver.
两阶D|?2 phase commit)
先说transaction的管理,如下图?nbsp;
transaction manager与不同的resource manager都有交互?
在phase1Ӟtransaction manager向两个resouce询问是否可以准备提交。Resouce可回复ready,
not_ready或是read_only. 当两个都readyӞ则可以进入phase2
q行提交。Q何一个回复not_ready则整个transaction 回滚。回复read_only的资源在phase2阶段被排除在提交q程之外?
让我们来x下面的话Q?br />
“?JTA 界定事务Q那么就需要有一个实?javax.sql.XADataSource ?
javax.sql.XAConnection ?javax.sql.XAResource 接口?JDBC
驱动E序。一个实Cq些接口的驱动程序将可以参与 JTA 事务。一?XADataSource 对象是一?XAConnection
对象的工厂?XAConnection s 是参?JTA 事务?JDBC q接?#8221;
要用JTA事务Q必M用XADataSource来生数据库q接Q生的q接Z个XAq接?/p>
XAq接Qjavax.sql.XAConnectionQ和非XAQjava.sql.ConnectionQ连接的区别在于QXA可以参与JTA的事务,而且不支持自动提交?/p>
Note:
Oracle, Sybase, DB2, SQL Server,MySQL(5.0以后InnoDB存储引擎){大型数据库才支持XA, 支持分布事务?
3.OFBiz中实现的事务
OFBiz采用Apache Commons DBCP作ؓ数据库连接池技术,分布式事务是通过Apache Geronimo Transaction实现的。下面是部分实现cdp:
TransactionFactory和ConnectionFactory都可以自己实现ƈ且在entityengine.xml中进行配|,OFBiz中默认配|的?/span>