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

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

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

    yeshucheng
    追逐自己,追逐方向,心隨悟所動
    posts - 24,comments - 24,trackbacks - 0

    在JDBC應用中,如果你已經(jīng)是稍有水平開發(fā)者,你就應該始終以PreparedStatement代替Statement.也就是說,在任何時候都不要使用Statement.
    基于以下的原因:
    一.代碼的可讀性和可維護性.
    雖然用PreparedStatement來代替Statement會使代碼多出幾行,但這樣的代碼無論從可讀性還是可維護性上來說.都比直接用Statement的代碼高很多檔次:

    stmt.executeUpdate("insert into tb_name (col1,col2,col2,col4) values ('"+var1+"','"+var2+"',"+var3+",'"+var4+"')");

    perstmt = con.prepareStatement("insert into tb_name (col1,col2,col2,col4) values (?,?,?,?)");
    perstmt.setString(1,var1);
    perstmt.setString(2,var2);
    perstmt.setString(3,var3);
    perstmt.setString(4,var4);
    perstmt.executeUpdate();

    不用我多說,對于第一種方法.別說其他人去讀你的代碼,就是你自己過一段時間再去讀,都會覺得傷心.

    二.PreparedStatement盡最大可能提高性能.
    每一種數(shù)據(jù)庫都會盡最大努力對預編譯語句提供最大的性能優(yōu)化.因為預編譯語句有可能被重復調用.所以語句在被DB的編譯器編譯后的執(zhí)行代碼被緩存下來,那么下次調用時只要是相同的預編譯語句就不需要編譯,只要將參數(shù)直接傳入編譯過的語句執(zhí)行代碼中(相當于一個涵數(shù))就會得到執(zhí)行.這并不是說只有一個 Connection中多次執(zhí)行的預編譯語句被緩存,而是對于整個DB中,只要預編譯的語句語法和緩存中匹配.那么在任何時候就可以不需要再次編譯而可以直接執(zhí)行.而statement的語句中,即使是相同一操作,而由于每次操作的數(shù)據(jù)不同所以使整個語句相匹配的機會極小,幾乎不太可能匹配.比如:
    insert into tb_name (col1,col2) values ('11','22');
    insert into tb_name (col1,col2) values ('11','23');
    即使是相同操作但因為數(shù)據(jù)內容不一樣,所以整個個語句本身不能匹配,沒有緩存語句的意義.事實是沒有數(shù)據(jù)庫會對普通語句編譯后的執(zhí)行代碼緩存.這樣每執(zhí)行一次都要對傳入的語句編譯一次.

    當然并不是所以預編譯語句都一定會被緩存,數(shù)據(jù)庫本身會用一種策略,比如使用頻度等因素來決定什么時候不再緩存已有的預編譯結果.以保存有更多的空間存儲新的預編譯語句.

    三.最重要的一點是極大地提高了安全性.

    即使到目前為止,仍有一些人連基本的惡義SQL語法都不知道.
    String sql = "select * from tb_name where name= '"+varname+"' and passwd='"+varpasswd+"'";
    如果我們把[' or '1' = '1]作為varpasswd傳入進來.用戶名隨意,看看會成為什么?

    select * from tb_name = '隨意' and passwd = '' or '1' = '1';
    因為'1'='1'肯定成立,所以可以任何通過驗證.更有甚者:
    把[';drop table tb_name;]作為varpasswd傳入進來,則:
    select * from tb_name = '隨意' and passwd = '';drop table tb_name;有些數(shù)據(jù)庫是不會讓你成功的,但也有很多數(shù)據(jù)庫就可以使這些語句得到執(zhí)行.

    而如果你使用預編譯語句.你傳入的任何內容就不會和原來的語句發(fā)生任何匹配的關系.(前提是數(shù)據(jù)庫本身支持預編譯,但上前可能沒有什么服務端數(shù)據(jù)庫不支持編譯了,只有少數(shù)的桌面數(shù)據(jù)庫,就是直接文件訪問的那些)只要全使用預編譯語句,你就用不著對傳入的數(shù)據(jù)做任何過慮.而如果使用普通的statement, 有可能要對drop,;等做費盡心機的判斷和過慮.

    上面的幾個原因,還不足讓你在任何時候都使用PreparedStatement嗎?

     

     

    有的新人可能此時對于用法還不太理解下面給個小例子

    Code Fragment 1:

    String updateString = "UPDATE COFFEES SET SALES = 75 " + "WHERE COF_NAME LIKE ′Colombian′"; 
    stmt.executeUpdate(updateString);

    Code Fragment 2:

    PreparedStatement updateSales = con.prepareStatement("UPDATE COFFEES SET SALES = ? WHERE COF_NAME LIKE ? "); 
    updateSales.setInt(1, 75); 
    updateSales.setString(2, "Colombian"); 
    updateSales.executeUpdate();

    set中的1對應第一個? 2對應第二個? 同時注意你set 的類型 是int還是string  哈哈很簡單吧


    原文出處:http://blog.csdn.net/spcusa/archive/2009/05/09/4164076.aspx

    posted @ 2010-12-14 13:58 葉澍成| 編輯 收藏

    //ValueObject類

    public class AdEntity {
        
    private String id;
        
    private String name;
        
    private String broker;
        
    private String date;
        
    private String body;
        
    //get/set
        
        
    public String toString(){
            
    return "【編號為:"+id+",廣告名稱為:"+name+",代理商為:"+broker+",發(fā)布日期為:"+date+",內容為:"+body+"";
        }
    }

    //調用任務類

    public class AdTask implements Callable<AdEntity> {
        @Override
        
    public AdEntity call() throws Exception {
            
    // 模擬遠程調用花費的一些時間
            Thread.sleep(5*1000);
            AdEntity vo
    =new AdEntity();
            vo.setId(String.valueOf(
    new Random().nextInt(1000)));
            vo.setName(
    "Ad@內衣廣告");
            vo.setBroker(
    "CHANNEL");
            Date date
    =new Date();
            SimpleDateFormat sdf
    =new SimpleDateFormat("yyyy-MM-dd");
            String dateStr
    =sdf.format(date);
            vo.setDate(dateStr);
            vo.setBody(
    "遠端內容");
            
    return vo;
        }
    }

    //主函數(shù)

    public class TestQueryMemg {
        
        
    /**
         * 
    @param args
         * 
    @throws ExecutionException 
         * 
    @throws InterruptedException 
         
    */
        
    public static void main(String[] args) throws InterruptedException, ExecutionException {
            ExecutorService exec
    =Executors.newCachedThreadPool();
            
    //創(chuàng)建Future來完成網(wǎng)絡調用任務
            Callable<AdEntity> returnAd=new AdTask();
            Future
    <AdEntity> future=exec.submit(returnAd);
            
            
    //開始執(zhí)行本地化查詢信息
            AdEntity localAd=new AdEntity();
            localAd.setId(String.valueOf(
    new Random().nextInt(1000)));
            localAd.setName(
    "Ad@食品廣告");
            localAd.setBroker(
    "蒙牛");
            SimpleDateFormat sdf
    =new SimpleDateFormat("yyyy-MM-dd");
            String dateStr
    =sdf.format(new Date());
            localAd.setDate(dateStr);
            localAd.setBody(
    "內容本地");

            System.out.println(
    "當前本地化查詢內容為:"+localAd.toString());
            System.out.println(
    "稍等片刻以獲取遠端信息");
            
            
    while(!future.isDone()){
                
    try {
                    Thread.sleep(
    1*1000);
                } 
    catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
            AdEntity entityRemote
    =(AdEntity)future.get();

            System.out.println(
    "合并查詢內容為:\n"+localAd.toString()+"\n"+entityRemote.toString());
        }
    }


     

     

     

    posted @ 2010-12-12 14:44 葉澍成| 編輯 收藏

    個人賬戶類:

    public class PrivateAccount implements Callable {
        Integer total;
        
    public Object call() throws Exception {
            Thread.sleep(
    5*1000);
            total
    =new Integer(new Random().nextInt(10000));
            System.out.println(
    "您個人賬戶上還有"+total+" 存款可以支配");
            
    return total;
        }
    }

    主函數(shù)測試:

    public class SumTest {
        
    /**
         * 
    @param args
         * 
    @throws ExecutionException 
         * 
    @throws InterruptedException 
         
    */
        
    public static void main(String[] args) throws InterruptedException, ExecutionException {
            Callable privateAccount
    =new PrivateAccount();
            FutureTask task
    =new FutureTask(privateAccount);
                    
    //創(chuàng)建新線程獲取個人賬戶信息
            Thread thread=new Thread(task);
            thread.start();

            
    int total=new Random().nextInt(1000);
            System.out.println(
    "主線程在這工作");
            System.out.println(
    "您目前操作金額為: "+total+" .");
            System.out.println(
    "請等待計算個人賬戶的金額");
            
    while(!task.isDone()){//判斷是否已經(jīng)獲取返回值
                try {
                    Thread.sleep(
    3*1000);
                } 
    catch (InterruptedException e) {
                    
    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }
            Integer privateSingle
    =(Integer)task.get();
            
    int post=privateSingle.intValue();
            
            System.out.println(
    "您當前賬戶共有金額為:"+(total+post)+" ¥");
        }

    }


     

     

    posted @ 2010-12-10 20:53 葉澍成| 編輯 收藏
    Memcached,人所皆知的remote distribute cache(不知道的可以javaeye一下下,或者google一下下,或者baidu一下下,但是鑒于baidu的排名商業(yè)味道太濃(從最近得某某事件可以看出),所以還是建議javaeye一下下),使用起來也非常的簡單,它被用在了很多網(wǎng)站上面,幾乎很少有大型的網(wǎng)站不會使用memcached。

    曾經(jīng)我也看過很多剖析memcached內部機制的文章,有一點收獲,但是看過之后又忘記了,而且沒有什么深刻的概念,但是最近我遇到一個問題,這個問題迫使我重新來認識memcache,下面我闡述一下我遇到的問題

    問題:我有幾千萬的數(shù)據(jù),這些數(shù)據(jù)會經(jīng)常被用到,目前來看,它必須要放到memcached中,以保證訪問速度,但是我的memcached中數(shù)據(jù)經(jīng)常會有丟失,而業(yè)務需求是memcached中的數(shù)據(jù)是不能丟失的。我的數(shù)據(jù)丟失的時候,memcached server的內存才使用到60%,也就是還有40%內存被嚴重的浪費掉了。但不是所有的應用都是這樣,其他應用內存浪費的就比較少。為什么內存才使用到60%的時候LRU就執(zhí)行了呢(之所以確定是LRU執(zhí)行是因為我發(fā)現(xiàn)我的數(shù)據(jù)丟失的總是前面放進去的,而且這個過程中,這些數(shù)據(jù)都沒有被訪問,比如第一次訪問的時候,只能訪問第1000w條,而第300w條或者之前的數(shù)據(jù)都已經(jīng)丟失了,從日志里看,第300w條肯定是放進去了)。

    帶著這些疑問,我開始重新審視memcached這個產(chǎn)品,首先從它的內存模型開始:我們知道c++里分配內存有兩種方式,預先分配和動態(tài)分配,顯然,預先分配內存會使程序比較快,但是它的缺點是不能有效利用內存,而動態(tài)分配可以有效利用內存,但是會使程序運行效率下降,memcached的內存分配就是基于以上原理,顯然為了獲得更快的速度,有時候我們不得不以空間換時間。

    也就是說memcached會預先分配內存,對了,memcached分配內存方式稱之為allocator,首先,這里有3個概念:
    1 slab
    2 page
    3 chunk
    解釋一下,一般來說一個memcahced進程會預先將自己劃分為若干個slab,每個slab下又有若干個page,每個page下又有多個chunk,如果我們把這3個咚咚看作是object得話,這是兩個一對多得關系。再一般來說,slab得數(shù)量是有限得,幾個,十幾個,或者幾十個,這個跟進程配置得內存有關。而每個slab下得page默認情況是1m,也就是說如果一個slab占用100m得內存得話,那么默認情況下這個slab所擁有得page得個數(shù)就是100,而chunk就是我們得數(shù)據(jù)存放得最終地方。

    舉一個例子,我啟動一個memcached進程,占用內存100m,再打開telnet,telnet localhost 11211,連接上memcache之后,輸入stats  slabs,回車,出現(xiàn)如下數(shù)據(jù):
    Java代碼 復制代碼
    1. STAT 1:chunk_size 80  
    2. STAT 1:chunks_per_page 13107  
    3. STAT 1:total_pages 1  
    4. STAT 1:total_chunks 13107  
    5. STAT 1:used_chunks 13107  
    6. STAT 1:free_chunks 0  
    7. STAT 1:free_chunks_end 13107  
    8. STAT 2:chunk_size 100  
    9. STAT 2:chunks_per_page 10485  
    10. STAT 2:total_pages 1  
    11. STAT 2:total_chunks 10485  
    12. STAT 2:used_chunks 10485  
    13. STAT 2:free_chunks 0  
    14. STAT 2:free_chunks_end 10485  
    15. STAT 3:chunk_size 128  
    16. STAT 3:chunks_per_page 8192  
    17. STAT 3:total_pages 1  
    18. STAT 3:total_chunks 8192  
    19. STAT 3:used_chunks 8192  
    20. STAT 3:free_chunks 0  
    21. STAT 3:free_chunks_end 8192  


    以上就是前3個slab得詳細信息
    chunk_size表示數(shù)據(jù)存放塊得大小,chunks_per_page表示一個內存頁page中擁有得chunk得數(shù)量,total_pages表示每個slab下page得個數(shù)。total_chunks表示這個slab下chunk得總數(shù)(=total_pages * chunks_per_page),used_chunks表示該slab下已經(jīng)使用得chunk得數(shù)量,free_chunks表示該slab下還可以使用得chunks數(shù)量。

    從上面得示例slab 1一共有1m得內存空間,而且現(xiàn)在已經(jīng)被用完了,slab2也有1m得內存空間,也被用完了,slab3得情況依然如此。 而且從這3個slab中chunk得size可以看出來,第一個chunk為80b,第二個是100b,第3個是128b,基本上后一個是前一個得1.25倍,但是這個增長情況我們是可以控制得,我們可以通過在啟動時得進程參數(shù) –f來修改這個值,比如說 –f 1.1表示這個增長因子為1.1,那么第一個slab中得chunk為80b得話,第二個slab中得chunk應該是80*1.1左右。

    解釋了這么多也該可以看出來我遇到得問題得原因了,如果還看不出來,那我再補充關鍵的一句:memcached中新的value過來存放的地址是該value的大小決定的,value總是會被選擇存放到chunk與其最接近的一個slab中,比如上面的例子,如果我的value是80b,那么我這所有的value總是會被存放到1號slab中,而1號slab中的free_chunks已經(jīng)是0了,怎么辦呢,如果你在啟動memcached的時候沒有追加-M(禁止LRU,這種情況下內存不夠時會out of memory),那么memcached會把這個slab中最近最少被使用的chunk中的數(shù)據(jù)清掉,然后放上最新的數(shù)據(jù)。這就解釋了為什么我的內存還有40%的時候LRU就執(zhí)行了,因為我的其他slab中的chunk_size都遠大于我的value,所以我的value根本不會放到那幾個slab中,而只會放到和我的value最接近的chunk所在的slab中(而這些slab早就滿了,郁悶了)。這就導致了我的數(shù)據(jù)被不停的覆蓋,后者覆蓋前者。

    問題找到了,解決方案還是沒有找到,因為我的數(shù)據(jù)必須要求命中率時100%,我只能通過調整slab的增長因子和page的大小來盡量來使命中率接近100%,但是并不能100%保證命中率是100%(這話怎么讀起來這么別扭呢,自我檢討一下自己的語文水平),如果您說,這種方案不行啊,因為我的memcached server不能停啊,不要緊還有另外一個方法,就是memcached-tool,執(zhí)行move命令,如:move 3 1,代表把3號slab中的一個內存頁移動到1號slab中,有人問了,這有什么用呢,比如說我的20號slab的利用率非常低,但是page卻又很多,比如200,那么就是200m,而2好slab經(jīng)常發(fā)生LRU,明顯page不夠,我就可以move 20 2,把20號slab的一個內存頁移動到2號slab上,這樣就能更加有效的利用內存了(有人說了,一次只移動一個page,多麻煩???ahuaxuan說,還是寫個腳本,循環(huán)一下吧)。

    有人說不行啊,我的memcache中的數(shù)據(jù)不能丟失啊,ok,試試新浪的memcachedb吧,雖然我沒有用過,但是建議大家可以試試,它也使利用memcache協(xié)議和berkeleyDB做的(寫到這里,我不得不佩服danga了,我覺得它最大的貢獻不是memcache server本身,而是memcache協(xié)議),據(jù)說它被用在新浪的不少應用上,包括新浪的博客。

    補充,stats slab命令可以查看memcached中slab的情況,而stats命令可以查看你的memcached的一些健康情況,比如說命中率之類的,示例如下:
    Java代碼 復制代碼
    1. STAT pid 2232  
    2. STAT uptime 1348  
    3. STAT time 1218120955  
    4. STAT version 1.2.1  
    5. STAT pointer_size 32  
    6. STAT curr_items 0  
    7. STAT total_items 0  
    8. STAT bytes 0  
    9. STAT curr_connections 1  
    10. STAT total_connections 3  
    11. STAT connection_structures 2  
    12. STAT cmd_get 0  
    13. STAT cmd_set 0  
    14. STAT get_hits 0  
    15. STAT get_misses 0  
    16. STAT bytes_read 26  
    17. STAT bytes_written 16655  
    18. STAT limit_maxbytes 104857600  

    從上面的數(shù)據(jù)可以看到這個memcached進程的命中率很好,get_misses低達0個,怎么回事啊,因為這個進程使我剛啟動的,我只用telnet連了一下,所以curr_connections為1,而total_items為0,因為我沒有放數(shù)據(jù)進去,get_hits為0,因為我沒有調用get方法,最后的結果就是misses當然為0,哇哦,換句話說命中率就是100%,又yy了。

    該到總結的時候了,從這篇文章里我們可以得到以下幾個結論:
    結論一,memcached得LRU不是全局的,而是針對slab的,可以說是區(qū)域性的。
    結論二,要提高memcached的命中率,預估我們的value大小并且適當?shù)恼{整內存頁大小和增長因子是必須的。
    結論三,帶著問題找答案理解的要比隨便看看的效果好得多。
    posted @ 2010-08-17 17:45 葉澍成| 編輯 收藏

    1. 關閉所有oracle的服務和程序
    2. 選擇開始| 程序|oracle Installation Products命令,運行Universal Installer,彈出歡迎對話框
    3. 單機 卸載產(chǎn)品 按鈕,彈出Inventory對話框
    4. 選中Inventroy對話框中的所有節(jié)點,點擊刪除,確認即可
    5. 選 擇 開始|運行 輸入regedit并按ENTER鍵,選擇HKEY_LOCAL_MACHINE\SOFTWARE\ORACLE,刪除此象,然后選擇 HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services,滾動此列表,刪除與oracle有關的所 有選項。
    6. 從桌面上、STARTUP和程序菜單中刪除所有ORACLE的組和圖標。
    7. 重啟系統(tǒng)。
    8. 刪除包括文件在內的安裝目錄。至此ORACLE的全部卸載完成。
    posted @ 2010-05-19 18:35 葉澍成| 編輯 收藏
    位運算應用口訣

    清零取位要用與,某位置一可用或

    若要取反和交換,輕輕松松用異或

    移位運算

    要點 1 它們都是雙目運算符,兩個運算分量都是整形,結果也是整形。

         2 "<<" 左移:右邊空出的位上補0,左邊的位將從字頭擠掉,其值相當于乘2。

         3 ">>"右移:右邊的位被擠掉。對于左邊移出的空位,如果是正數(shù)則空位補0,若為負數(shù),可能補0或補1,這取決于所用的計算機系統(tǒng)。

         4 ">>>"運算符,右邊的位被擠掉,對于左邊移出的空位一概補上0。

    位運算符的應用 (源操作數(shù)s 掩碼mask)

    (1) 按位與-- &

    1 清零特定位 (mask中特定位置0,其它位為1,s=s&mask)

    2 取某數(shù)中指定位 (mask中特定位置1,其它位為0,s=s&mask)

    (2) 按位或-- |

        常用來將源操作數(shù)某些位置1,其它位不變。 (mask中特定位置1,其它位為0 s=s|mask)

    (3) 位異或-- ^

    1 使特定位的值取反 (mask中特定位置1,其它位為0 s=s^mask)

    2 不引入第三變量,交換兩個變量的值 (設 a=a1,b=b1)

        目 標           操 作              操作后狀態(tài)

    a=a1^b1         a=a^b              a=a1^b1,b=b1

    b=a1^b1^b1      b=a^b              a=a1^b1,b=a1

    a=b1^a1^a1      a=a^b              a=b1,b=a1

    二進制補碼運算公式:

    -x = ~x + 1 = ~(x-1)

    ~x = -x-1

    -(~x) = x+1

    ~(-x) = x-1

    x+y = x - ~y - 1 = (x|y)+(x&y)

    x-y = x + ~y + 1 = (x|~y)-(~x&y)

    x^y = (x|y)-(x&y)

    x|y = (x&~y)+y

    x&y = (~x|y)-~x

    x==y:    ~(x-y|y-x)

    x!=y:    x-y|y-x

    x< y:    (x-y)^((x^y)&((x-y)^x))

    x<=y:    (x|~y)&((x^y)|~(y-x))

    x< y:    (~x&y)|((~x|y)&(x-y))//無符號x,y比較

    x<=y:    (~x|y)&((x^y)|~(y-x))//無符號x,y比較

    應用舉例

    (1) 判斷int型變量a是奇數(shù)還是偶數(shù)           

    a&1   = 0 偶數(shù)

           a&1 =   1 奇數(shù)

    (2) 取int型變量a的第k位 (k=0,1,2……sizeof(int)),即a>>k&1

    (3) 將int型變量a的第k位清0,即a=a&~(1<<k)

    (4) 將int型變量a的第k位置1, 即a=a|(1<<k)

    (5) int型變量循環(huán)左移k次,即a=a<<k|a>>16-k   (設sizeof(int)=16)

    (6) int型變量a循環(huán)右移k次,即a=a>>k|a<<16-k   (設sizeof(int)=16)

    (7)整數(shù)的平均值

    對于兩個整數(shù)x,y,如果用 (x+y)/2 求平均值,會產(chǎn)生溢出,因為 x+y 可能會大于INT_MAX,但是我們知道它們的平均值是肯定不會溢出的,我們用如下算法:

    int average(int x, int y)   //返回X,Y 的平均值

    {   

         return (x&y)+((x^y)>>1);

    }

    (8)判斷一個整數(shù)是不是2的冪,對于一個數(shù) x >= 0,判斷他是不是2的冪

    boolean power2(int x)

    {

        return ((x&(x-1))==0)&&(x!=0);

    }

    (9)不用temp交換兩個整數(shù)

    void swap(int x , int y)

    {

        x ^= y;

        y ^= x;

        x ^= y;

    }

    (10)計算絕對值

    int abs( int x )

    {

    int y ;

    y = x >> 31 ;

    return (x^y)-y ;        //or: (x+y)^y

    }

    (11)取模運算轉化成位運算 (在不產(chǎn)生溢出的情況下)

             a % (2^n) 等價于 a & (2^n - 1)

    (12)乘法運算轉化成位運算 (在不產(chǎn)生溢出的情況下)

             a * (2^n) 等價于 a<< n

    (13)除法運算轉化成位運算 (在不產(chǎn)生溢出的情況下)

             a / (2^n) 等價于 a>> n

            例: 12/8 == 12>>3

    (14) a % 2 等價于 a & 1       

    (15) if (x == a) x= b;

                else x= a;

            等價于 x= a ^ b ^ x;

    (16) x 的 相反數(shù) 表示為 (~x+1)

    posted @ 2010-03-30 13:59 葉澍成 閱讀(408) | 評論 (0)編輯 收藏
    主站蜘蛛池模板: 女人让男人免费桶爽30分钟| 亚洲欧洲国产精品香蕉网| 毛片免费全部免费观看| 亚洲av午夜电影在线观看| 国产成人精品久久亚洲| 麻豆国产精品免费视频| 特级毛片全部免费播放| 亚洲第一区香蕉_国产a| 热久久精品免费视频| 国产成人免费ā片在线观看老同学| 亚洲午夜在线一区| 日韩精品亚洲aⅴ在线影院| jizz免费在线观看| 亚洲午夜一区二区电影院| 亚洲精品WWW久久久久久| 无码国产精品一区二区免费虚拟VR | 青青久久精品国产免费看| 无码欧精品亚洲日韩一区夜夜嗨| 亚洲a∨无码一区二区| 久久亚洲伊人中字综合精品| 亚洲免费视频在线观看| 久久综合亚洲鲁鲁五月天| 亚洲成av人片一区二区三区| 日本免费网站视频www区| 中国毛片免费观看| 亚洲av片在线观看| 亚洲AV成人噜噜无码网站| 亚洲欧洲日产国码无码久久99| 永久久久免费浮力影院| 五月亭亭免费高清在线| 男人天堂免费视频| 午夜成人无码福利免费视频| 亚洲成a人片在线看| 精品亚洲aⅴ在线观看| 亚洲熟妇av一区二区三区漫画| 日本免费一区尤物| 成年性午夜免费视频网站不卡| 91人人区免费区人人| 久久精品成人免费观看| 两性色午夜免费视频| 一区二区三区免费高清视频|