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

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

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

    在路上

    路上有驚慌,路上有理想

      BlogJava :: 首頁 :: 聯系 :: 聚合  :: 管理
      28 Posts :: 1 Stories :: 10 Comments :: 0 Trackbacks

    #

    常用sql:

    SHOW VARIABLES LIKE 'character%';查看字符集
    SHOW VARIABLES LIKE 'collation_%';
    show engines;查看引擎
    show databases; 查看數據庫

    show tables;

    desc table_name;

    GRANT ALL PRIVILEGES ON *.* TO 'guming'@'localhost' IDENTIFIED BY 'guming' WITH GRANT OPTION;授權
    show PRIVILEGES;查看權限
    show grants for test@localhost;查看用戶權限
    select * from mysql.user where user='test';

    函數
    邏輯:case when,isnull,IFnull等

    數學:mod,cell,floor,round(),trancate(),abs()

    字符串函數:rtrim,ltrim,substring,locate(),INSTR(),length,left,right
       REPEAT(str,count)
        返回一個由重復的字符串str 組成的字符串,字符串str的數目等于count 。 若 count <= 0,則返回一個空字符串。若str 或 count 為 NULL,則返回 NULL 。
       REPLACE(str,from_str,to_str)
        返回字符串str 以及所有被字符串to_str替代的字符串from_str 。
       REVERSE(str)
       返回字符串 str ,順序和字符順序相反。

    日期函數:current_date,datediff,adddate,date_add,dayofweek,dayofyear,dayofmonth,month,hour(),
          str_to_date: SELECT STR_TO_DATE('20031031',GET_FORMAT(DATE,'ISO'));
          select date_format(current_date(),'%Y-%m-%d %W');
          select extract(YEAR_MONTH FROM current_date());
    轉換函數:
    cast:可使用CAST()函數將某個值轉為另外一種類型。CONVERT
    convert_TZ:CONVERT_TZ()  將時間日期值dt  從from_tz  給出的時區轉到to_tz給出的時區
    concat:返回結果為連接參數產生的字符串。如有任何一個參數為NULL ,則返回值為 NULL。

    全文檢索
     SELECT * FROM articles WHERE MATCH (title,body) AGAINST ('database');
      在默認狀態下, 搜索的執行方式為不區分大小寫方式。然而,你可以通過對編入索引的列使用二進制排序方式執行區分大小寫的全文搜索。     例如,可以向一個使用latin1字符集的列給定latin1_bin   的排序方式,對于全文搜索區分大小寫。
     利用IN BOOLEAN MODE修改程序, MySQL 也可以執行布爾全文搜索:
    mysql> SELECT * FROM articles WHERE MATCH (title,body)
        -> AGAINST ('+MySQL -YourSQL' IN BOOLEAN MODE);
    這個問詢檢索所有包含單詞“MySQL”的行,但不檢索包含單詞“YourSQL”的行。

     全文搜索支持查詢擴展功能 (特別是其多變的“盲查詢擴展功能” )。若搜索短語的長度過短, 那么用戶則需要依靠全文搜索引擎通常缺乏的內隱知識進行查詢。這時,查詢擴展功能通常很有用。例如, 某位搜索 “database” 一詞的用戶,
     可能認為“MySQL”、“Oracle”、“DB2” and “RDBMS”均為符合 “databases”的項,因此都應被返回。這既為內隱知識。
    mysql> SELECT * FROM articles
        -> WHERE MATCH (title,body)
        -> AGAINST ('database' WITH QUERY EXPANSION);
       
    加密函數:
    ENCRYPT()
    md5()
    password()
    字符集操作
    SELECT CHARSET(CONVERT('abc' USING utf8));SELECT CHARSET(USER());

    查詢緩存設置:
    服務器啟動時要禁用查詢緩存,設置query_cache_size系統變量為0,query_cache_type=on
    SET GLOBAL query_cache_size = 40000;
    SHOW VARIABLES LIKE 'query_cache_size';
    SHOW VARIABLES LIKE 'query_cache%';
    開啟緩存后:
    select * from ad_position where id=201;
    SHOW STATUS LIKE 'Qcache_hits';  查詢命中次數

     SET SESSION query_cache_type = ON;(ON:1,OFF:0,2:DEMAND)
      on 啟用緩存,SELECT SQL_NO_CACHE除外
      off 不用緩存,
      DEMAND 僅對以SELECT SQL_CACHE開始的那些查詢語句啟用緩存。
    清除緩存:
     可以使用FLUSH QUERY CACHE語句來清理查詢緩存碎片以提高內存使用性能。該語句不從緩存中移出任何查詢。
     RESET QUERY CACHE語句從查詢緩存中移出所有查詢。FLUSH TABLES語句也執行同樣的工作。
     
    什么類型的數據緩存?
    查詢結果集緩存,對于動態的結果集是不緩存的。必須是一樣的sql,并且結果集無變化。
    表更新后,對應表的緩存失效,此時同一sql有很能結果集不同了。
    注釋:查詢緩存不返回舊的數據。當表更改后,查詢緩存值的相關條目被清空。
    注釋:如果你有許多mysqld服務器更新相同的MyISAM表,在這種情況下查詢緩存不起作用。
    注釋:查詢緩存不適用于服務器方編寫的語句。如果正在使用服務器方編寫的語句,要考慮到這些語句將不會應用查詢緩存
    調整緩存:
    ·         query_cache_min_res_unit默認值是4KB。這應該適合大部分情況。

    ·         如果你有大量返回小結果數據的查詢,默認數據塊大小可能會導致內存碎片,顯示為大量空閑內存塊。由于缺少內存,內存碎片會強制查詢緩存從緩存內存中修整(刪除)查詢。這時,你應該減少query_cache_min_res_unit變量的值。
              空閑塊和由于修整而移出的查詢的數量通過Qcache_free_blocks和Qcache_lowmem_prunes變量的值給出。

    ·         如果大量查詢返回大結果(檢查 Qcache_total_blocks和Qcache_queries_in_cache狀態變量),你可以通過增加 query_cache_min_res_unit變量的值來提高性能。但是,注意不要使它變得太大(參見前面的條目)。

    更改存儲引擎
    ALTER TABLE engineTest ENGINE = ARCHIVE;

    字符集設置:

    在ini文件中加入下面配置:

    default-character-set = utf8
    character_set_server = utf8

    導入數據庫備份時遇到的問題,空間不夠

    修改ini文件中的配置:max_allowed_packet = 16M

     

    參考文檔:http://doc.mysql.cn/mysql5/refman-5.1-zh.html-chapter/

    posted @ 2010-09-09 11:10 阮步兵 閱讀(1944) | 評論 (0)編輯 收藏

    集群后,受管appserver1,appserver2,appserver13,無法啟動,報錯如下:

    <BEA-090504> <Certificate chain received from localhost - 127.0.0.1 failed hostname verification check. Certificate contained LENOVO-D01793DE but check expected localhost>

    問題的原因:主機名驗證不通過。在安裝bea weblogic時,當時的主機名為 LENOVO-D01793DE,后進行了變更。而weblogic的服務器證書沒有更新,還是老的主機名,所以始終不匹配。注:即使寫 ip/localhost也沒用,發送url時是附帶主機名的。

    方案1:更改notemanger.hosts文件,加入主機名和ip,結果還是不起作用。

    方案2:在server的StartWeblogic.sh  java參數加入-Dweblogic.security.SSL.ignoreHostnameVerification=true

               在startNodeManager.sh java參數加入 -Dweblogic.security.SSL.hostnameVerifier=examples.security.sslclient.NulledHostnameVerifier

                結果還是不起作用

    方案3:在keystore ssl的配置中,高級配置有一項客戶端特性-->主機名驗證 選為 ‘無’,結果測試通過,成功

    下面是此項配置的說明,估計在java 參數里加入 -Dweblogic.security.SSL.HostnameVerifier=none 應該也可以

    如果不愿意加,就在console里一個一個改吧

    weblogic.security.SSL.HostnameVerifier

    在 SSL 握手期間,主機名驗證可確定 URL 中的主機名是否與服務器標識中的主機名相匹配;需要進行此驗證以防止中間人攻擊。
    WebLogic Server 提供了基于證書的 HostnameVerifier 實現,默認情況下使用該實現,它用于驗證 URL 主機名是否與服務器證書的 CN 字段值相匹配。
    您可以使用管理控制臺“SSL”選項卡之下的“高級選項”窗格,用自定義主機名驗證器替換此默認的主機名驗證器;這將影響在使用 WebLogic SSL API 的服務器上運行的 SSL 客戶端的默認值。另外,通過諸如 HttpsURLConnectionSSLContext 的 WebLogic SSL API,可以顯式設置自定義 HostnameVerifier。
    posted @ 2010-09-02 22:53 阮步兵 閱讀(4245) | 評論 (1)編輯 收藏

         摘要:   Weblogic server 端口號  內存分配  ...  閱讀全文
    posted @ 2010-09-01 21:58 阮步兵 閱讀(2399) | 評論 (0)編輯 收藏

    寫在前面的話:spring的監聽事件模型應該是觀察者模式。本人項目里的應用在process方法按日期同步某個庫的數據,在方法最后publish一個event事件,這個事件用于后續同步過來的數據處理。事件處理采用了spring的監聽模型.這樣可以做到process方法與event可以異步分離執行。(注:這個事件模型缺省使用SyncTaskExecutor來執行listener的注冊event,所有該listener注冊的event事件為同步執行的)。

    當然,spring的這個機制還有很多應用的場景,就不一一列舉了。

    ApplicationEvent

    事件抽象類,里面只有一個構造函數和一個timestamp。

    ApplicationListener

    監聽接口,里面只有一個onApplicationEvent方法。需要用戶自己編寫ApplicationListener的實現。

    ApplicationContext

    spring上下文,其publishEvent方法用于通知監聽器(ApplicationListener的實現)注冊event時間.

    publishEvent

    void publishEvent(ApplicationEvent event)

    Notify all listeners registered with this application of an application event.

    源碼解讀:
    1.作為ApplicationContext的實現AbstractApplicationContext.java的成員變量applicationListeners,是一個ArrayList,保存了所有的ApplicationListener
    2.利用ApplicationEventMulticaster接口里的方法來完成注冊監聽addApplicationListener,移除監聽removeApplicationListener,removeAllListeners,以及通知監聽注冊事件event:multicastEvent(ApplicationEvent event);
    上面說到的publishEvent方法即使用了multicastEvent方法

    SimpleApplicationEventMultucaster作為ApplicationEventMulticaster的一個實現,提供了multicastEvent的實現代碼,其實就是迭代所有的監聽器,用SyncTaskExecutor同步執行listener的onApplicationEvent

    public void multicastEvent(final ApplicationEvent event) {

    for (Iterator it = getApplicationListeners().iterator(); it

    .hasNext();) {

    final ApplicationListener listener = (ApplicationListener) it

    .next();

    getTaskExecutor().execute(new Runnable() {

    public void run() {

    listener.onApplicationEvent(event);
    }
    });
    }

    3.注意事項:自己編寫ApplicationListener的實現時,要注意不同的監聽器處理不同的事件(復寫onApplicationEvent)。原因就是multicastEvent的執行原理。它是迭代執行所有的監聽器onApplicationEvent

    這里是ApplicationEventMulticaster的類分布圖



    abstract public class AbstractApplicationEventMulticaster implements ApplicationEventMulticaster(Code)(Java Doc)
    public interface ApplicationEventMulticaster (Code)(Java Doc)

    public class SimpleApplicationEventMulticaster extends

    這里是ApplicationContext的類分布圖
    public class DefaultResourceLoader implements ResourceLoader(Code)(Java Doc)
    public interface ResourceLoader (Code)(Java Doc)

    abstract public class AbstractApplicationContext extends DefaultResourceLoader implements ConfigurableApplicationContext,DisposableBean(Code)(Java Doc)
    public interface ConfigurableApplicationContext extends ApplicationContext,Lifecycle(Code)(Java Doc)
    public interface DisposableBean (Code)(Java Doc)

    public class GenericApplicationContext extends AbstractApplicationContext implements BeanDefinitionRegistry(Code)(Java Doc)
    public interface BeanDefinitionRegistry (Code)(Java Doc)

    abstract public class AbstractRefreshableApplicationContext extends
    下面是spring自身的事件應用
    1) ContextRefreshedEvent:當ApplicationContext初始化或者刷新時觸發該事件。
    2) ContextClosedEvent:當ApplicationContext被關閉時觸發該事件。容器被關閉時,其管理的所有單例Bean都被銷毀。
    3) RequestHandleEvent:在Web應用中,當一個http請求(request)結束觸發該事件。
    4) ContestStartedEvent:當容器調用ConfigurableApplicationContext的Start()方法開始/重新開始容器時觸發該事件。
    5) ContestStopedEvent:當容器調用ConfigurableApplicationContext的Stop()方法停止容器時觸發該事件。

    posted @ 2010-09-01 10:41 阮步兵 閱讀(5351) | 評論 (6)編輯 收藏

    1.類介紹:
    Executor
    接口提供一種將任務提交與每個任務將如何運行的機制(包括線程使用的細節、調度等)分離開來的方法。
    它只有一個方法excute(Runnable command),你可以復寫此方法,讓Runnable同步或異步執行
    ExecutorServiceExecutor的一個子接口,提供了管理線程的方法,可為跟蹤一個或多個異步任務執行狀況而生成 Future 的方法。
    ThreadPoolExecutor是ExecutorService的一個實現類,它通常與Executors工廠一起使用。
    下面的方法取自Executors類
    public static ExecutorService newFixedThreadPool(int nThreads) {
    return new ThreadPoolExecutor(nThreads, nThreads,
    0L, TimeUnit.MILLISECONDS,
    new LinkedBlockingQueue<Runnable>());
    }
    這里面使用ThreadPoolExecutor創建一個線程數為nThreads的線程池。
    類似的工廠方法還有很多,可以查看JDK
    ExecutorService的常用方法:
    invokeAll 執行所有任務,全部執行完畢后返回每個任務的結果(FutureList),包括每個任務的狀態
    invokeAny 與上面方法的區別是,只返回一個任務成功執行結果Future
    submit 提交一個Task去執行,并返回執行結果
    awaitTermination 當執行線程中斷、超時,或調用了shutdown方法后,阻塞直到所有的Task都執行結束。
    shutdown 關閉所有執行過的Task,并不再接收新線程
    isTerminated 如果所有Task都關閉則返回True,前提是調用過shutdown或shutdownNow
    2.使用示例:
    a.首先定義一個輔助類SystemConstant,大致方法如下:
    //初始化一個線程池
    public static ExecutorService getExecutor() {
    if(PROCESS_EXECUTOR == null || PROCESS_EXECUTOR.isTerminated()) {
    PROCESS_EXECUTOR = Executors.newFixedThreadPool(EXECUTOR_SIZE);
    }
    return PV_PROCESS_EXECUTOR;
    }
    //定義關閉方法
    public static void awaitTerminationExecutor(long timeout, TimeUnit unit) {
    getExecutor().shutdown();
    try {
    getExecutor().awaitTermination(timeout, unit);
    } catch (InterruptedException e) {
    e.printStackTrace();
    }
    }
    b.接下來是調用:
    try {
    SystemConstant.getExecutor().invokeAll(SystemUtils.toCallable(
    new SystemUtils.CallableHandle<IPvProcess>() {

    public void handle(Process process) throws Exception {
    process.processLogs(logs, statDate);
    }

    }, prepareProcesses), perOutOfTime, TimeUnit.HOURS);
    } catch (Exception e) {
    logger.error(e);
    }
    SystemConstant.awaitTerminationProgramExecutor(allOutOfTime, TimeUnit.HOURS);

    3. 類結構圖

    java.util.concurrent
    Class ThreadPoolExecutor

    java.lang.Object
    extended by java.util.concurrent.AbstractExecutorService
    extended by java.util.concurrent.ThreadPoolExecutor
    All Implemented Interfaces:
    Executor, ExecutorService
    Direct Known Subclasses:
    ScheduledThreadPoolExecutor
    posted @ 2010-08-31 21:37 阮步兵 閱讀(4880) | 評論 (0)編輯 收藏

    1.實體map.xml中配置:
    主鍵獲取方式配置,mysql
    <selectKey  resultClass="java.lang.Integer" keyProperty="id">
              select LAST_INSERT_ID()
    </selectKey>

    動態拼接where條件
    <dynamic prepend="where">
                <isNotNull>
                    plateId=#value#
                </isNotNull>
    </dynamic>
    2.config配置
    typeAlias 定義類型別名
    <typeAlias alias="Item" type="com.tudou.tudoupromotion.entity.Item"/>

    typeHandler 自定義類型轉換
    比如,將數據庫中的1,2,3格式的數據轉換為java 枚舉
     <typeHandler javaType="com.tudou.tudoupromotion.entity.Plate" callback="com.tudou.tudoupromotion.ext.ibatis.PlateHandler"/>

    線程緩存等配置

        <settings
         cacheModelsEnabled="true"
         enhancementEnabled="true"
         lazyLoadingEnabled="false"
         maxRequests="32"
         maxSessions="10"
         maxTransactions="5"
         useStatementNamespaces="true"
        />
       cacheModelsEnabled="true"  是否啟動緩存機制
      enhancementEnabled="true"  是否針對POJO啟動字節碼增強機制以提升getter/setter的調用效能避免使用javaReflect所帶來的性能開銷。同時Lazy Loading帶來極大的性能提升。
      maxRequests最大并發請求數(Statement數)
      maxTransactions最大并發事務數
      maxSessions最大Session數,即當前最大允許的并發SqlMapCliect數maxSessions設定必須界于 maxTransactions和maxRequests之間.即   maxTransactions>maxSessions>maxRequests

    posted @ 2010-08-30 22:31 阮步兵 閱讀(257) | 評論 (0)編輯 收藏

    如果用過python,就知道它有了command line 工具,比如你輸入 print 'a' ,該工具輸出:a,好處是便于快速學習python 語法。

    其實java也可以做到。

    下面是一個java 腳本解釋器的helloword版本,思路如下:

    1動態創建一個Temp.java類文件,里面只有一個excute方法,把從控制臺輸入 的字符串加入到類方法中,比如for(int i=0;i<10;i++){System.out.println(i);}。

    2再利用com.sun.tools.javac.Main.compile 動態編譯Temp.java 生成class

    3將Temp.class載入到jvm

    4生成object實例,利用反射執行excute方法

    說明,這只是個test版本。

    public class Test {
       public static void main(String[] args) throws IOException, ClassNotFoundException, InstantiationException, IllegalAccessException, IllegalArgumentException, SecurityException, InvocationTargetException, NoSuchMethodException{
          
           
            BufferedReader reader  = new BufferedReader(new InputStreamReader(System.in));
            while(true){
                String js=reader.readLine();
               OutputStream os = new FileOutputStream("Temp.java"); 
                String tempJava="public class Temp"+
                   " {   "+
                    " public void excute() "+
                    " {  "+
                     js+
                    " }  "+
                   " }  ";
                os.write(tempJava.getBytes());  
                os.close();
                String[] compileArgs = new String[] {"Temp.java"};  
                com.sun.tools.javac.Main.compile(compileArgs);  
                URLClassLoader loader =  
                   new URLClassLoader(new URL[]{new File(".").toURI().toURL()}); 
                Class<?> scriptClass = loader.loadClass("Temp");
                Object obj = scriptClass.newInstance();
                obj.getClass().getDeclaredMethod("excute").invoke(obj);
                obj=null;
            }
       }
    }

    posted @ 2010-08-30 22:29 阮步兵 閱讀(407) | 評論 (0)編輯 收藏

    ORMUnit下載鏈接:
    http://code.google.com/p/ormunit/
        在做面向關系數據庫的應用系統的時候,db表結構在開發過程中,可能會由于前期的設計不足導致不斷的修改表結構。如果Java層面采用類似Hibernate ORM,隨之對應的是maps & pojos的修改。此時修改后的簡單測試就顯得尤為重要。
        ORMUnit功能比較多,本文只取其少數幾個類,完成上面的功能。
        1.首先改寫:HibernateORMTestCase類,指定加載的hibernate.cfg.xml位置
        public abstract class HibernateORMTestCase extends TestCase {
        protected Log logger = LogFactory.getLog(getClass());
        protected SessionFactory sessionFactory;
        //Location of hibernate.cfg.xml file.
        private static String CONFIG_FILE_LOCATION = "com/mmm/china/xxx/dbtest/hibernate.cfg.xml";
       
        protected Configuration cfg;
       
        public void setSessionFactory(SessionFactory sessionFactory) {
            this.sessionFactory = sessionFactory;
        }
        /**
         * make configuration
         * @return
         */
        protected Configuration getConfiguration() {
            if (cfg == null) {
                cfg=new Configuration().configure(CONFIG_FILE_LOCATION);
            }
            return cfg;
        }

       } 
        2.HibernateSchemaChecker類(檢查db schema map pojo):改寫輸出不符合map關系的表以及變更腳本,并增加計數功能
         List getSignificantDifferences(
                String[] script) {
            int num=0;
            List differences = new ArrayList();
            for (int i = 0; i < script.length; i++) {
                String line = script[i];
              
                if (line.indexOf("add constraint") == -1)
                    {
                     differences.add(line);
                     logger.error("DIFF_LINE>>>>>>>>>>="+line);
                    }
                else{
                    num++;//計算有多少個外鍵有問題
                    logger.info("CONSTRAINT_LINE>>>>>>>>>>"+num+"="+line);
                }
            }
            return differences;
        }
          注:ORMUnit 檢查CONSTRAINT 有問題,在db為sqlserver時,生成的外鍵約束的名稱是自動命名的,與實際數據庫的命名不一致,ORMUnit就認為不匹配,所以,要過濾add constraint的error信息
       3.使用HibernateSchemaTests 進行junit測試
        public class HibernateSchemaTests extends HibernateORMTestCase  {
       
        private HibernateSchemaChecker schemaChecker;

        protected void setUp() throws Exception {
            super.setUp();
            schemaChecker = new HibernateSchemaChecker(getConfiguration(), getConfiguration().buildSessionFactory());
        }

        /**
         * Verifies  all tables and columns referenced by the object/relational
         * mapping exist
         *
         * @throws Exception
         */
        public void assertDatabaseSchema() throws Exception {
            schemaChecker.assertDatabaseSchema();
        }

       }
      總結:只需要三個類,即可測試數據庫schema與hibernate maps & pojo的map關系是否完全匹配,事半功倍。
    posted @ 2010-03-03 14:55 阮步兵 閱讀(306) | 評論 (0)編輯 收藏

    在數據庫從sqlserver2000升級到2005后,原有的左右連接(*=和=*)寫法均不在支持,為了不修改app的代碼,可以通過以下語句 調整sqlserver2005 database的兼容級別:

    sp_dbcmptlevel [ [ @dbname = ] name ]
        [ , [ @new_cmptlevel = ] version ]

    參數
    [@name =] name

    數據庫的名稱,將對此數據庫的兼容級別進行更改。數據庫的名稱必須遵循標識符的規則。name 的數據類型為 sysname,默認值為 NULL。

    [@new_cmptlevel =] version

    數據庫要兼容的 SQL Server 版本,對于sqlserver2000來說,version的值為80。

    For example: sp_dbcmptlevel dbname,80

    查看兼容級別:sp_helpdb dbname

     

    posted @ 2010-03-02 21:56 阮步兵 閱讀(389) | 評論 (0)編輯 收藏

       ——Apache Roller源碼分析

        系統中,某些DB數據需要頻繁更新,但實時性不強,可以采用延時更新的方式。設定一個間隔時間,累計更新數據,再通過特定的work thread統一更新。Apache Roller這個開源的Java Blog 正是才用了這種方式,實現站點計數的延時更新。

       優點:減少了數據庫的一部分壓力。尤其是在高并發下,數據庫I/O及并發處理的壓力

       缺點:實效性差,用戶在某個時間點內獲取的數據不準確。

       附圖為 實現數據延時更新的Class Diagram

       

     

     說明:

         HitCountQueue.java 為站點計數隊列,singleton instance,通過processHit 方法添加站點計數,通過resetHits方法清空Queue,為防止同步問題,增加了synchronized。在其構造函數內,會啟動一個 workThread實例,完成隊列數據到數據庫的持久化工作。

        Job interface 為任務接口

        HitCountProcessingJob.java 實現了Job接口,完成數據更新的任務。

        WorkerThread.java 執行Job的工作線程,ContinuousWorkerThread繼承自WorkerThread,增加了時間間隔的功能。線程執行后,會sleep 指定的時間。

    posted @ 2010-02-27 15:38 阮步兵 閱讀(323) | 評論 (0)編輯 收藏

    僅列出標題
    共3頁: 上一頁 1 2 3 下一頁 
    主站蜘蛛池模板: 日本免费的一级v一片| 色婷婷7777免费视频在线观看| 国产成人在线观看免费网站| 久久国产亚洲精品| 91手机看片国产永久免费| 亚洲妇女水蜜桃av网网站| 国产精品久久永久免费| 亚洲国产精品成人精品软件| 69成人免费视频| 亚洲日韩精品A∨片无码加勒比| 四虎www成人影院免费观看| 亚洲精品久久无码av片俺去也| 国产自产拍精品视频免费看| 免费人成大片在线观看播放| 色久悠悠婷婷综合在线亚洲| 日本黄色动图免费在线观看| 亚洲系列中文字幕| 成人免费午间影院在线观看| 美国毛片亚洲社区在线观看| 久久亚洲国产精品五月天婷| 你懂的免费在线观看网站| 亚洲视频国产视频| 免费无码看av的网站| 国产免费高清69式视频在线观看 | 全免费a级毛片免费看| 亚洲区精品久久一区二区三区| 在线免费视频一区| 久久精品成人免费国产片小草| 亚洲五月六月丁香激情| 天天摸夜夜摸成人免费视频| 国产精品黄页免费高清在线观看 | 亚洲日韩小电影在线观看| 少妇太爽了在线观看免费视频 | 亚洲欧洲日产国码在线观看| 国产小视频在线观看免费| 免费看无码特级毛片| 亚洲一区二区三区成人网站 | 久久久久亚洲av无码专区蜜芽| 免费观看美女用震蛋喷水的视频| 久久亚洲AV成人无码国产电影| 亚洲一区二区三区香蕉|