<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    2009年6月6日

    總結(jié)(2)是針對EJB3的事務(wù)和安全中的容器管理事務(wù)(CMT),BMT及安全部分放在總結(jié)(3)中。
    完全是自己學(xué)習(xí)的心得,還請前輩們指點(diǎn)。

     

    EJB3的事務(wù)與安全

    EJB3的是事務(wù)也符合ACID,即原子性、一致性、隔離型、持久性。這些特性與數(shù)據(jù)庫事務(wù)一致,需要強(qiáng)調(diào)的是一致性,在事務(wù)開始前,系統(tǒng)是處于一種遵守業(yè)務(wù)規(guī)則和約束的一致狀態(tài)下,那么在事務(wù)提交或回滾之后,系統(tǒng)也必須維持這種一致性狀態(tài)。在事務(wù)進(jìn)行過程中不必處于不一致性狀態(tài),事務(wù)在這里就像一個沙箱(sand-box)。

    EJB中,事務(wù)也具有隔離級別的控制,但一般不用通過EJB容器來控制,而是在數(shù)據(jù)庫資源這一級別來進(jìn)行控制。

     

    要知道在EJB容器中,代碼層面的所有操作最終都是轉(zhuǎn)化為兩級的數(shù)據(jù)庫操作,比如鎖定和解鎖數(shù)據(jù)庫中的某行或某張表。事務(wù)日志來反映事務(wù)的變化,開始事務(wù)日志代表事務(wù)的開始,應(yīng)用日志代表以提交該事務(wù)來結(jié)束,相反放棄日志就代表回滾事務(wù)而結(jié)束。

     

    資源管理器(Resource Manager)的概念是管理特定某種資源的事務(wù)的組件。這個概念不僅包括關(guān)系數(shù)據(jù)庫系統(tǒng),也可以使消息服務(wù)器或其他業(yè)務(wù)系統(tǒng)。

     

    如果只涉及一種單一資源的事務(wù)就稱為local transaction本地事務(wù),相反大多數(shù)企業(yè)應(yīng)用都是需要涉及多種不同的資源。這時候就需要一種類型的組件來管理事務(wù)中多種資源,這個組件稱為事務(wù)管理器(Transaction Manager),它在多個管理各自資源事務(wù)的資源管理之間進(jìn)行協(xié)調(diào)和控制。

     

    分布式的事務(wù)管理是通過一種稱為兩段式提交(two-phase commit)的機(jī)制來完成。現(xiàn)在最為流行的分布式事務(wù)協(xié)議是XA協(xié)議(XA Protocol),JavaEE就是通過該協(xié)議來完成分布式應(yīng)用中的事務(wù)管理。

     

    事務(wù)管理

    JavaEE中事務(wù)使用JTAJava Transaction API,是建立在Java Transaction Service之上的服務(wù)),即javax.tranaction.UserTransaction接口,容器在后臺會自動管理大多數(shù)事務(wù)細(xì)節(jié),EJB開發(fā)者只需控制開始和停止事務(wù)、建立事務(wù)邊界(transaction boundary)以及是否提交/回滾業(yè)務(wù)即可。

    EJB3中提供了兩種具體的事務(wù)方式,即容器管理的事務(wù)(Container-managed transactionCMT)和bean管理的事務(wù)(Bean-managed transactionBMT)。其中前者是使用聲明式地或通過部署描述符來管理事務(wù);后者需要以顯式編碼的方式來管理。但需要注意的是在EJB3中,只有SessionBeanMessageDrivenBean才支持CMTBMTJPA中并不直接依賴CMTBMT。但是當(dāng)然,在任何JavaEE容器中都可透明得插入CMTBMT的事務(wù)環(huán)境。

    EJB3中管理事務(wù)最簡單靈活的方式是采用容器管理事務(wù),即CMT

     

    容器管理的事務(wù),顧名思義,容器來做“事務(wù)開始、事務(wù)提交或回滾”。容器在調(diào)用方法前開始JTA事務(wù),接著會調(diào)用業(yè)務(wù)方法,最后根據(jù)調(diào)用中發(fā)生的情況去決定是提交事務(wù)還是回滾事務(wù)。使用CMT事務(wù)管理,只需關(guān)注@TransactionManagement@TransactionAttribute注解,同時通過EJBContext的方法來回滾事務(wù)。

     

    1@TransactionMangement注解用于向容器標(biāo)識該bean的事務(wù)管理是使用CMT還是BMT,是通過該標(biāo)簽中的value屬性來指明TransactionManagementType的枚舉值。

     

    2@TransactionAttribute注解,盡管由容器為我們來管理事務(wù)的各種細(xì)節(jié),但是仍然需要通過該注解來告知容器如何去自動管理。

    CMT對事務(wù)的管理可以在包裝bean的方法時開始,也可以從調(diào)用者的事務(wù)中進(jìn)行join開始。

    TransactionAttributeType有幾個枚舉值:

    (1)      REQUIRED:如果調(diào)用者沒有事務(wù),容器則創(chuàng)建新事務(wù);如果調(diào)用者具有事務(wù),容器則連接join調(diào)用者事務(wù)。

    (2)      REQUIRED_NEW:如果調(diào)用者沒有事務(wù),容器就創(chuàng)建新事務(wù);如果調(diào)用者有事務(wù),容器暫停原來事務(wù),并創(chuàng)建新的事務(wù)。

    (3)      SUPPORTS:如果調(diào)用者沒有事務(wù),容器就不創(chuàng)建事務(wù);反之則join并使用調(diào)用者的事務(wù)。

    (4)      MANDATORY:如果調(diào)用者沒有事務(wù),容器拋出javax.ejb.EJBTransactionRequiredException異常;反之則連接并使用調(diào)用者的事務(wù)。

    (5)      NOT_SUPPORTED:如果調(diào)用者沒有事務(wù),容器便不使用事務(wù)調(diào)用方法;反之則暫停調(diào)用者事務(wù)以non-transactional的方式調(diào)用方法。

    (6)      NEVER:如果調(diào)用者沒有事務(wù),容器直接調(diào)用方法;反正拋出javax.ejb.EJBException異常。

     

    a.    對于第1種情況,適合的場景是從non-transactionalWeb層調(diào)用bean方法,如果方法調(diào)用出現(xiàn)異常,那么容器不僅會rollback整個事務(wù),同時也會向調(diào)用者拋出javax.transaction.RollbackException異常,以通知調(diào)用者事務(wù)已被回滾了。

    b.    2種情況中,始終需要容器去創(chuàng)建新的事務(wù),對于調(diào)用者原有的事物,容器就會暫停它,直到方法調(diào)用返回為止就恢復(fù)原有事務(wù)。這樣的結(jié)果就是方法調(diào)用所創(chuàng)建的新事務(wù)無論成功與否,都不會對調(diào)用者原有的事務(wù)造成影響。

    c.    SUPPORT選項(xiàng)表示本質(zhì)上容器將會按照調(diào)用者的事務(wù)情況來處理,通常的場景是用于一些只讀型的操作,比如檢索數(shù)據(jù)記錄等。

    d.    MANDATORY表示對容器對事務(wù)的強(qiáng)制性要求,如果調(diào)用者存在事務(wù),容器就join并使用調(diào)用者事務(wù);但如果調(diào)用者沒有事務(wù)環(huán)境,就會拋出EJBTransactionRequiredException異常。這種選項(xiàng)適合于如果方法調(diào)用失敗進(jìn)行回滾時也保證調(diào)用者環(huán)境的失敗。

    e.    對于NOT_SUPPORT,容器處理的本質(zhì)是要求不能在事務(wù)環(huán)境下調(diào)用bean方法。如果調(diào)用者存在事務(wù),容器會先暫停它,然后開始方法調(diào)用,在返回后恢復(fù)調(diào)用者的事務(wù)。

    f.    NEVER表明在CMT中,容器不能允許從事務(wù)性環(huán)境中調(diào)用bean方法,否則會拋出EJBException異常。

     

    對于前面這六種TransactionAttributeTypeMDB并不是全部都支持,它支持REQUIREDNOT_SUPPORT兩種。這一點(diǎn)與MDB的特性有關(guān):客戶端無法直接調(diào)用MDB,所以事務(wù)屬性中的SUPPORTREQUIRED_NEWMANDATORY就沒有意義。

    CMT事務(wù)管理的真正機(jī)制

    很重要的一點(diǎn):CMT方法要求容器回滾事務(wù)并不是立即進(jìn)行的,而是向容器設(shè)置回滾標(biāo)識,在事務(wù)結(jié)束的時候,容器檢查該標(biāo)志,如果不需回滾則提交該事務(wù),如果需要回滾則進(jìn)行。

    通過EJBContext或其子類:SessionContextMessageDrivenContextsetRollbackOnly()方法,將回滾標(biāo)志位置為true,當(dāng)方法調(diào)用結(jié)束時,容器檢查該狀態(tài)以判斷是否提交事務(wù)或是回滾事務(wù)。

    需要注意的一點(diǎn)是,本質(zhì)上,使用EJBContext進(jìn)行設(shè)置標(biāo)志位時,它是作為底層事務(wù)的一個上層抽象代理。所以使用時,必須保證有底層事務(wù)存在,也就是說必須在REQUIRED,REQUIRED_NEW,MADATORY這三種事務(wù)屬性下使用!因?yàn)檫@三種事務(wù)屬性都可以使容器保證底層事務(wù)的存在,即無論方法調(diào)用者是否存在事務(wù)環(huán)境,容器都會創(chuàng)建新事務(wù)。

    setRollbackOnly()方法對應(yīng)的是getRollbackOnly()方法,該方法返回當(dāng)前EJBContext中回滾標(biāo)志位的狀態(tài)。該方法在業(yè)務(wù)處理中十分有用,考慮這樣一個場景:

    在進(jìn)行一段非常長的資源密集型操作前如果前事務(wù)的前部分已經(jīng)失敗,那就是在一個注定要回滾的事務(wù)上付出很多代價。所以在這類操作之前應(yīng)該先check一下rollbackOnly是否已經(jīng)置為true

    此外,處理該標(biāo)志位狀態(tài)的代碼經(jīng)常分布在業(yè)務(wù)邏輯的catch塊中,如果catch了某種exception,則一邊記錄進(jìn)log,一邊通過set方法置狀態(tài)位。在EJB3中,可以通過@ApplicationException注解使得“捕獲異常轉(zhuǎn)化為事務(wù)回滾”變成透明的機(jī)制。

    @AplicationException注解

    @javax.ejb.ApplicationException該注解可以用來控制事務(wù)性輸出,將要拋出的異常類型在定義時加上該標(biāo)簽,同時設(shè)置該標(biāo)簽的rollback屬性,即@ApplicationException(rollback=true/false)。應(yīng)用異常(ApplicationException)是希望調(diào)用者或客戶端處理的,一般認(rèn)為除了java.rmi.RemoteExceptionjava.lang.RuntimeException之外都是應(yīng)用異常。而從上述兩種異常繼承出的子類異常都被認(rèn)為是系統(tǒng)異常,這種異常不會傳遞給調(diào)用者或客戶端而是wrappedEJBException中。

    添加此注解的異常無論是checked exception還是unchecked exception(比如運(yùn)行時異常),都會被認(rèn)為是應(yīng)用異常(application exception),從而傳遞給方法調(diào)用者或客戶端。

    默認(rèn)情況下,所有checked exception或所有被注解為應(yīng)用異常的checked/unchecked exception,都不會以CMT的方式回滾,如果把rollback屬性設(shè)置為true,則會通知容器失敗時進(jìn)行事務(wù)回滾,并且是在把應(yīng)用異常傳遞給調(diào)用者或客戶端之前進(jìn)行的。

    如果有未預(yù)料的unchecked exception,比如ArrayOutOfBoundsExceptionNullPointerException,容器仍然會回滾CMT事務(wù),但是在這種情況下,容器會認(rèn)為bean處在了一種inconsistent的情況下,會進(jìn)而銷毀bean實(shí)例,這是十分消耗資源的,所以you should never delibrately use system exceptions.

     

    CMT使開發(fā)人員不必關(guān)心EJB事務(wù)中的大部分細(xì)節(jié),當(dāng)然同時CMT能提供對事務(wù)的控制級別也更少,這一點(diǎn)Bean管理的事務(wù)(BMT)更適合。

     

    posted @ 2009-06-06 21:11 J@mes 閱讀(922) | 評論 (0)編輯 收藏

    2009年5月29日

    作為近期學(xué)習(xí)EJB3  的一些心得和總結(jié),完全是自己的理解和白話,前輩們請多指教

    EJB3學(xué)習(xí)總結(jié)(1)

    現(xiàn)狀

    EJB2得到了較廣泛的應(yīng)用,但真正用對場合的項(xiàng)目不多,那些強(qiáng)調(diào)分布式,即業(yè)務(wù)邏輯和Web是在分布在不同物理層的大型項(xiàng)目。更多得是使用在中小型web應(yīng)用之上。

    EJB3SpringHibernate等一系列輕量級框架運(yùn)動的發(fā)展后現(xiàn)身了,EJB3是基于POJO組件的,同時提供了事務(wù)、安全、ORM和分布式等諸多特點(diǎn),同時AOPDIAnnotation等特性也進(jìn)一步提高了EJB3的易用性。

    EJB3規(guī)范

    EJB3規(guī)范包含3個技術(shù)文檔:

    1.       EJB3 Simplified API

    2.       EJB3 Core Contracts & Requirement

    3.       Java Persistence API

    EJB3組件模型

    1.       Session Bean:執(zhí)行業(yè)務(wù)服務(wù)、控制事務(wù)及資源訪問

    2.       Message Driven Bean:異步調(diào)用,通過JMS關(guān)聯(lián)消息隊(duì)列(Queue)及Topic來響應(yīng)外部事件

    3.       Entity:具有唯一標(biāo)示的實(shí)體,是持久化的基礎(chǔ)。

    SessionBeanMDBean統(tǒng)稱為Enterprise Bean,這點(diǎn)不同于EJB2規(guī)范。EntityBean已經(jīng)劃分由持久化Provider去管理和控制,不再由EJB容器管理。

    EJB3框架

    它提供了對EJB3組件的各種支持,包括容器事務(wù)、安全服務(wù)、資源池的管理(包括線程池、連接池、實(shí)例池)以及組件生命周期的管理、并發(fā)支持等。

    EJB3的核心features

    1.       聲明式的元數(shù)據(jù):通過Java5AnnotationXML來聲明式地去指定Enterprise BeanEntity Bean的行為和特性。如果同時使用兩種方式時,XML描述具有更高的優(yōu)先級。

    2.       按異常配置:對于大量可使用default配置的地方都可以省去繁瑣的配置,只有需要不按默認(rèn)行為的才需要顯式得通過注解或XML來進(jìn)行描述。強(qiáng)調(diào)用戶只有需要配置時才進(jìn)行配置,可以使代碼更為簡潔。

    3.       良好的可伸縮性:EJB3的實(shí)現(xiàn)中在三個方面保證了良好的伸縮性,(1)通過資源池最大程度上對重新對象的重用;(2)使用持久化及緩存避免重復(fù)查詢和重復(fù)創(chuàng)建實(shí)體;(3)優(yōu)化的鎖定策略,避免對DB的并發(fā)鎖定。

    4.       JTAJava Transaction API)定義了分布式事務(wù)的標(biāo)準(zhǔn)APIEJB容器作為JTA的事務(wù)管理器。

    5.       通過聲明的方式來控制方法級別的訪問控制,達(dá)到多層安全性。

    6.       實(shí)體Bean被替換成POJO,簡單、輕量,不用再去實(shí)現(xiàn)專門的接口,同時可以脫離EJB容器。

    7.       SessionBean也更加靈活,不再需要主接口(Home Interface.

    8.       依賴注入(dependency injection),可以通過AnnotationXML的方式將依賴數(shù)據(jù)“推(push)”到bean。例如:將EntityManager注入到SessionBean中,以使會話可以與持久化單元進(jìn)行交互。

    9.       攔截器和回調(diào)(Call-back):通過攔截器來完成某些回調(diào)方法。

    10.   對于SessionBeanMDB,不在需要主方法(ejbCreate()),使用默認(rèn)構(gòu)造器來替代。同時也不需要再擴(kuò)展專有接口。

    11.   對于EntityBean,主接口(Home interface)也被替換成EntityManager,后者是一個單例實(shí)例工廠,可以管理實(shí)體Bean的生命周期。

    12.   EJB3的分布式計(jì)算模型:EJB3也基于RMI遠(yuǎn)程服務(wù),遠(yuǎn)程接口方法按值傳遞以提供粗粒度的模型。

    EJB3角色

    1.       定義Enterprise Bean及相關(guān)meta-data的三種角色:

    (1)       企業(yè)Bean提供者(Enterprise Bean provider),負(fù)責(zé)去定義和實(shí)現(xiàn)業(yè)務(wù)邏輯和結(jié)構(gòu);負(fù)責(zé)定義實(shí)體的持久化結(jié)構(gòu)及互相關(guān)系。

    (2)       應(yīng)用裝配者(Application assembler)。

    EJB3的會話Bean

    EJB3中,SessionBean包括兩種類型,Stateful SessionBeanStateless SessionBean

    顧名思義,Stateless SessionBean不需維持客戶請求的會話狀態(tài);而Stateful SessionBean則需要維持特定客戶請求的會話狀態(tài),同時bean實(shí)例也是用客戶請求綁定的。

    Stateless SessionBean

    無狀態(tài)會話Bean由兩個元素組成:業(yè)務(wù)接口,用來定義所提供的服務(wù);bean類,是對服務(wù)接口的實(shí)現(xiàn)。注意此處,不需像EJB2.x中分別實(shí)現(xiàn)EJBObjectSessionBean接口。

    通過示例,通過定義本地接口和(或)遠(yuǎn)程接口來定義業(yè)務(wù)接口,這里Local接口和Remote接口的選擇遵循一個原則:如果業(yè)務(wù)的請求者與SessionBean處在同一個JVM中,則可以使用本地接口,反之則必須使用遠(yuǎn)程接口。

    原則上,如果同時使用了本地接口和遠(yuǎn)程接口,則必須保證二者定義的接口一致,同時由實(shí)現(xiàn)的Bean實(shí)現(xiàn)這些方法。

    無狀態(tài)會話Bean無需實(shí)現(xiàn)EJB特定的接口或擴(kuò)展類,只需在類級別使用注解——@Stateless即可。同時也在本地接口及遠(yuǎn)程接口的類級別添加注解——@Local@Remote

    通過前面對EJB3特性的介紹,可以知道EJB3DIDependency Injection)的良好支持!在EJB3中,可以將各類資源注入到會話Bean中,這些資源可以是其他的會話Bean、數(shù)據(jù)源或者是JMS中的隊(duì)列(Queue)等。要實(shí)現(xiàn)依賴注入可以通過添加注解,也可以在XML配置文件中進(jìn)行描述,但需注意的是,如果二者都進(jìn)行的配置則以XML文件中的描述為準(zhǔn)。

    以注解的方式為例,只需添加@Resource注解即可,注入可以通過兩種方式:實(shí)例變量和setter方法上。

    回調(diào)(Call-back),通過回調(diào),可以對Bean在其生命周期內(nèi)各個階段進(jìn)行更細(xì)粒度的控制和管理。使用回調(diào)方法也很簡單,回調(diào)方法沒有多余的限制,只需添加正確的注解即可。

    無狀態(tài)會話Bean兩個主要的用于回調(diào)方法的注解分別是:@PostConstruct@PreDestroy。其中@PostConstruct的方法會在該bean被實(shí)例化后回調(diào)執(zhí)行,但需要注意的是,如果該bean有配置了需要注入的資源,那該回調(diào)方法則會緊跟著資源的注入之后而執(zhí)行。

    @PreDestroy的回調(diào)方法則是在容器即將銷毀bean實(shí)例之前被調(diào)用,主要用來做一些善后的工作,比如對資源的關(guān)閉和清理。(補(bǔ)充,在有狀態(tài)會話Bean中,該方法是在最后一個帶有@Remove注解的方法調(diào)用后才被調(diào)用,之后容器銷毀bean實(shí)例。)

    另一個關(guān)鍵的元素是攔截器(Interceptor),攔截器的使用也很便捷,通過添加正確的注解即可。攔截器的概念與其他JavaEE的框架或規(guī)范中的一致,即攔截業(yè)務(wù)方法的調(diào)用,可以在攔截點(diǎn)附加新的業(yè)務(wù)邏輯,結(jié)合依賴注入特性,可以充分得做到關(guān)注點(diǎn)分離(Separation of Concerns)。Enterprise Bean中會話Bean和消息驅(qū)動Bean可以定義攔截器方法。

    攔截器注解可以添加到方法級別,也可以添加到類級別。被標(biāo)注的方法在被調(diào)用時會被攔截器類攔截,并插隊(duì)式的先去調(diào)用攔截器的方法。對于用到的攔截器類需要添加@Interceptor注解,如果有多個攔截器則使用@Interceptors

    @AroundInvoke注解為例,攔截器方法需要關(guān)注InvocationContext接口,通過它可以獲得被攔截的bean類(Class)、bean中的方法(Method)等,需要強(qiáng)調(diào)的是其中的proceed()方法,通過它將攔截請求往后傳遞,或者到攔截器鏈中的下一個,或者是結(jié)束攔截調(diào)用真正的bean方法。

    EJB3規(guī)范中定義了兩種類型的異常,分別是應(yīng)用異常和系統(tǒng)異常。應(yīng)用異常是業(yè)務(wù)邏輯中產(chǎn)生的checked exception;而系統(tǒng)異常則是EJB系統(tǒng)級產(chǎn)生的異常,同時系統(tǒng)異常都是RemoteExceptionRuntimeException的子類,是unchecked exception

    有狀態(tài)會話BeanStateful SessionBean)在特性及細(xì)節(jié)上與無狀態(tài)會話Bean很相似。

    會話Bean的用戶視圖

    訪問會話Bean的用戶視圖可以有三種形式:

    1.       通過Remote接口,遠(yuǎn)程客戶具有位置無關(guān)性。

    2.       通過Local接口,這兩種方式中請求方可以是其他的EJB組件,可以是ServletJSP等。需要注意的是,本地客戶具有位置依賴性。

    3.       WebService方式,可以將會話Bean發(fā)布成為一個WebService,供客戶調(diào)用。

    客戶請求會話Bean時,或者通過依賴注入或者通過查找JNDI,來獲得會話Beanstub對象,請求是通過stub來進(jìn)行調(diào)用的。對于無狀態(tài)會話Bean,每次請求將獲得新的stub,而有狀態(tài)會話Bean,則在請求方緩存stub,這樣才能使容器知道該返回哪個與客戶相關(guān)聯(lián)的bean實(shí)例。

    通過依賴注入獲得會話Bean業(yè)務(wù)接口的方式是添加注解@EJB,注意要與@Resource區(qū)分開。

    相比查找JNDI,使用注入的方式會更加簡潔,通常對于遠(yuǎn)程請求使用JNDI更適合。

    有狀態(tài)會話BeanStateful SessionBean

    通過實(shí)現(xiàn)SessionSynchronization接口,可以在事務(wù)點(diǎn)上獲得EJB容器的通知:afterBegin,在新事物開始時;beforeCompletion,在事物提交前;afterCompletion,在事物執(zhí)行完之后。

    有狀態(tài)會話Bean中的回調(diào)方法除了PostConstructPreDestroy外,還有PreActivatePrePassivate,分別使用@PreActivate@PrePassivate來注解。

    前兩個回調(diào)方法的細(xì)節(jié)與無狀態(tài)會話Bean一致,分別在(1)實(shí)例化Bean之后并執(zhí)行完資源注入后執(zhí)行;(2@Remove方法執(zhí)行完畢之后。

    對于有狀態(tài)會話Bean中的@Remove方法,也是一個管理bean生命周期的方法,調(diào)用該方法后,容器將會從實(shí)例池中將該bean刪除。

    帶有@PrePassivate注解的方法會由EJB容器調(diào)用,當(dāng)某個有狀態(tài)會話Bean實(shí)例長時間空閑,則容器調(diào)用該方法將此bean實(shí)例鈍化,并將狀態(tài)緩存起來。

    當(dāng)客戶請求再次需要使用被鈍化的某bean實(shí)例時,容器調(diào)用該bean@PreActivate方法,返回一個創(chuàng)建好的并帶有狀態(tài)的新實(shí)例。

    有狀態(tài)會話Bean的攔截器方法需要注意的是,如果實(shí)現(xiàn)SessionSynchronization接口的beanafterBegin始終發(fā)生在@AroundInvoke的任何方法前。

    posted @ 2009-05-29 22:28 J@mes 閱讀(755) | 評論 (0)編輯 收藏

    僅列出標(biāo)題  
    主站蜘蛛池模板: 亚洲人成精品久久久久| 毛茸茸bbw亚洲人| 亚洲色偷偷色噜噜狠狠99| 午夜私人影院免费体验区| 亚洲av色香蕉一区二区三区| 亚洲第一永久AV网站久久精品男人的天堂AV | 亚洲天堂电影在线观看| 成年人免费视频观看| 一级白嫩美女毛片免费| 亚洲人成网站在线播放影院在线| 无码一区二区三区免费视频| 尤物视频在线免费观看| 亚洲精品人成电影网| 亚洲精品成人在线| 免费A级毛片无码无遮挡内射| 免费看美女午夜大片| 亚洲伊人久久大香线蕉啊| 亚洲成a人片在线观看国产| 成年女人看片免费视频播放器| 国产日本一线在线观看免费| 日韩精品无码一区二区三区免费| 国产精品亚洲精品日韩动图| 久久久久亚洲AV无码网站| 免费一级e一片在线播放| 最近新韩国日本免费观看| 男女男精品网站免费观看| 亚洲av永久无码精品网址| 亚洲日韩国产AV无码无码精品| 亚洲精品国产精品乱码视色| 精品久久久久久久免费加勒比| 麻豆精品成人免费国产片| 免费大片av手机看片高清| 国产成人高清亚洲一区久久| 国产亚洲精彩视频| 边摸边吃奶边做爽免费视频网站 | 久久精品私人影院免费看| 男女作爱免费网站| 一级片在线免费看| 免费无码一区二区三区蜜桃| 污网站在线观看免费| 国产成人精品免费大全|