精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

SQLite做為本地緩存應注意的幾大方面

數據庫 其他數據庫
今天我們要介紹的就是如何利用SQLite作為本地緩存的方法。其擁有適應于本地數據緩存和應用程序等諸多優點。

今天看到了園友陸敏計的一篇文章<<C#數據本地存儲方案之SQLite>>, 寫到了SQLite的諸多優點,尤其適應于本地數據緩存和應用程序。

轉自陸兄的內容,來夸夸Sqlite:

SQLite官方網站: http://www.sqlite. org/ 時第一眼看到關于SQLite的特性。

1. ACID事務

2. 零配置 – 無需安裝和管理配置

3. 儲存在單一磁盤文件中的一個完整的數據庫

4. 數據庫文件可以在不同字節順序的機器間自由的共享

5. 支持數據庫大小至2TB

6. 足夠小, 大致3萬行C代碼, 250K

7. 比一些流行的數據庫在大部分普通數據庫操作要快

8. 簡單, 輕松的API

9. 包含TCL綁定, 同時通過Wrapper支持其他語言的綁定

10. 良好注釋的源代碼, 并且有著90%以上的測試覆蓋率

11. 獨立: 沒有額外依賴

12. Source完全的Open, 你可以用于任何用途, 包括出售它

13. 支持多種開發語言,C, PHP, Perl, Java, ASP .NET,Python

正好前一段時間我做了這方面的應用,我就結合陸兄的這篇文章,談談我在Sqlite本地緩存業務數據時的經驗,給大家借鑒一下。我開發時比較倉促,很多地方請大家多提意見。

解決的問題

首先介紹我用Sqlite解決的實際問題是什么?

問題1:某個功能的數據需要連接一個遠程數據庫查詢速度很慢,查一次數據不容易,希望能夠重復利用之前查過的數據集。

問題2:非常大的數據量比如幾千萬甚至幾億條數據,一次性讀取到DataTable中,會內存溢出的,所以在第一次分析時就是通過Reader的方式,分析完一條后并不在內存中保存,但是緊接著用戶的第二次分析、第三次分析還是要用到的第一次分析的數據,如果我們重新查詢一次遠程服務器,效率可想而知啊。

結合上面的2個問題,為了解決效率問題和數據重復利用度,減少數據庫服務器的壓力,我才用Sqlite緩存數據(當然這不是唯一也不是最好的解決方案) 。

優化SQLiteHelper

陸兄的SQLiteHelper類我增加了幾個有用的方法:

第一個方法是GetSchema,得到某個表的表結構。

  1. /// <summary>     
  2. /// 查詢數據庫中的所有數據類型信息     
  3. /// </summary>     
  4. /// <returns></returns>     
  5. public DataTable GetSchema()  
  6. {  
  7.     using (SQLiteConnection connection = new SQLiteConnection(connectionString))  
  8.     {  
  9.         connection.Open();  
  10.         DataTable data = connection.GetSchema("TABLES");  
  11.         connection.Close();  
  12.         //foreach (DataColumn column in data.Columns)     
  13.         //{     
  14.         //    Console.WriteLine(column.ColumnName);     
  15.         //}     
  16.         return data;  
  17.     }  

第二個方法是IsTableExist,判斷SQLite數據庫重某個表是否存在 。

  1. /// <summary>     
  2. /// 判斷SQLite數據庫表是否存在    
  3. /// </summary>     
  4. /// <param name="dbPath">要創建的SQLite數據庫文件路徑</param>     
  5. public bool IsTableExist(string tableName)  
  6. {  
  7.     using (SQLiteConnection connection = new SQLiteConnection(connectionString))  
  8.     {  
  9.         connection.Open();  
  10.         using (SQLiteCommand command = new SQLiteCommand(connection))  
  11.         {  
  12. command.CommandText = "SELECT COUNT(*) FROM sqlite_master where type='table' and name='" + tableName + "'";  
  13.             int iaaa = Convert.ToInt32(command.ExecuteScalar());  
  14.             if (Convert.ToInt32(command.ExecuteScalar()) == 0)  
  15.             {  
  16.                 return false;  
  17.             }  
  18.             else  
  19.             {  
  20.                 return true;  
  21.             }  
  22.         }  
  23.     }  

第三個方法是Query,執行查詢語句,返回DataSet

  1. /// <summary> 
  2. /// 執行查詢語句,返回DataSet  
  3. /// </summary> 
  4. /// <param name="SQLString">查詢語句</param> 
  5. /// <returns>DataSet</returns> 
  6. public DataSet Query(string SQLString)  
  7. {  
  8.     using (SQLiteConnection connection = new SQLiteConnection(connectionString))  
  9.     {  
  10.         DataSet ds = new DataSet();  
  11.         try  
  12.         {  
  13.             connection.Open();  
  14.             SQLiteDataAdapter command = new SQLiteDataAdapter(SQLString, connection);  
  15.             command.Fill(ds, "ds");  
  16.         }  
  17.         catch (System.Data.SQLite.SQLiteException ex)  
  18.         {  
  19.             throw new Exception(ex.Message);  
  20.         }  
  21.         return ds;  
  22.     }  

構建緩存對象模型和緩存控制器

每一塊緩存對象,在數據庫中會產生一個表,而表名稱是有緩存控制器自動生成的,訪問緩存的工作全部交由緩存控制器完成,通過緩存項的ID和ModuleKey來訪問。

在Sqlite中還需要一個系統表來維護每個緩存項和實際緩存存儲表之間的對應關系,我們稱之為配置表,它將在緩存控制器創建Sqlite緩存數據庫文件時創建。

配置表共有以下幾個字段,分別和緩存對象模型CdlCacheItem類映射:

列名稱 說明
Id 緩存的唯一數字編號
ModuleKey 緩存模塊名稱,一個模塊可以有多個緩存數據,ID可以區分。實際應用時,某個功能時會經常緩存數據的,所以通過ModuleKey就可以得到這個功能所有的緩存列表,然后選定其中的部分緩存來進行使用。
Comments 緩存說明
TableName 緩存數據存儲的數據表名稱
AddDate 緩存時間戳

創建數據庫的方法如下

  1. static void CreateDB()  
  2. {  
  3.     //總共有ID、ModuleKey、Comments、AddDate這幾列  
  4.     string sql = "CREATE TABLE SYSCDLTABLES(ID 
  5. INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT UNIQUE,MODULEKEY VARCHAR(200),
  6. COMMENTS VARCHAR(500),TABLENAME VARCHAR(100),ADDDATE DATETIME)";  
  7.     SQLiteDBHelper.CreateDB(CACHEFILEPATH, sql);  

每個緩存項(緩存對象模型)定義如下,和配置表對應:

  1. /// <summary> 
  2. /// 緩存項對象  
  3. /// </summary> 
  4. /// <Author>Tecky Lee</Author> 
  5. /// <Date>2011-1-11 15:11</Date> 
  6. public class CdlCacheItem  
  7. {  
  8.     int m_id;  
  9.  
  10.     public int Id  
  11.     {  
  12.         get { return m_id; }  
  13.         set { m_id = value; }  
  14.     }  
  15.     string m_moduleKey;  
  16.  
  17.     public string ModuleKey  
  18.     {  
  19.         get { return m_moduleKey; }  
  20.         set { m_moduleKey = value; }  
  21.     }  
  22.     string m_comments;  
  23.  
  24.     public string Comments  
  25.     {  
  26.         get { return m_comments; }  
  27.         set { m_comments = value; }  
  28.     }  
  29.     string m_tableName;  
  30.  
  31.     public string TableName  
  32.     {  
  33.         get { return m_tableName; }  
  34.         set { m_tableName = value; }  
  35.     }  
  36.     DateTime m_timestamp;  
  37.  
  38.     public DateTime Timestamp  
  39.     {  
  40.         get { return m_timestamp; }  
  41.         set { m_timestamp = value; }  
  42.     }  

下面是控制器的接口定義:

  1. public interface ICdlCacheController  
  2.     {  
  3.         void BeginLoadRow();  
  4.         void EndLoadRow();  
  5.         System.Collections.Generic.IList<CdlCacheItem> GetCdlCacheItems(string moduleKey);  
  6.         CdlCacheItem GetCdlCacheItems(int id);  
  7.         void LoadRow(System.Data.DataRow row, string tableName);  
  8.         void LoadRow(IEnumerable<object> row, string tableName);  
  9.         string LoadTable(System.Data.DataTable dt, string moduleKey, string comments);  
  10.         System.Data.Common.DbDataReader QueryCdlTableReader(CdlCacheItem item);  
  11.         System.Data.DataTable QueryCdlTables(CdlCacheItem item);  
  12.         System.Data.DataTable QueryCdlTables(string sql);  
  13.         void RemoveAllTables();  
  14.         void RemoveCdlTables(string moduleKey);  
  15.         void RemoveCdlTables(System.Collections.Generic.IList<CdlCacheItem> items);  
  16.         void RemoveCdlTables(CdlCacheItem item);  
  17.         void RemoveCdlTables(int id);  
  18.     } 

上面的函數下面來做個說明:

1、BeginLoadRow、LoadRow和EndLoadRow,三個函數組為了在我們查詢主數據庫時使用Reader方式讀取數據時,可以一條條將數據同時存放在緩存中。

2、RemoveAllTables和RemoveCdlTables是用來刪除緩存項的。

3、GetCdlCacheItems,通過moduleKey得到多個緩存項。比如用戶想基于這幾天內保存的某個功能的數據做一次快速分析,那么我們就可以通過這個函數得到緩存列表,由用戶選擇列表中的一個來繼續。

4、QueryCdlTableReader,得到某個緩存數據的Reader對象,這樣可以一行行的分析,一次讀出大數據量的數據到DataTable中,內存可能會溢出的。

5、QueryCdlTables,將某個緩存項查詢并裝載到DataTable中。

提高緩存數據寫入效率

Sqlite在保存數據的時候,比如一次保存一個億條的數據,一條條插入效率非常低下,網上也有人對其進行討論。

效率低下的主要原因在于IO操作次數過于頻繁,所以在LoadTable或者是使用BeginLoadRow·EndLoadRow的時候,使用了事務來減少數據提交的次數,結果保存的效率非常的高,我測試的結果是400萬條數據查詢,只需要幾十秒鐘,這點時間相對于重新查一次遠程服務器那是可以忽略了。

下面給出BeginLoadRow和EndLoadRow的具體代碼(只有在EndRow的時候才會提交一次數據):

  1. SQLiteConnection m_connection;  
  2. SQLiteCommand m_command;  
  3. DbTransaction m_transaction;  
  4. public void BeginLoadRow()  
  5. {  
  6.     m_connection = new SQLiteConnection("Data Source=" + CACHEFILEPATH);  
  7.  
  8.     m_connection.Open();  
  9.     m_transaction = m_connection.BeginTransaction();  
  10.     m_command = new SQLiteCommand(m_connection);  
  11. }  
  12. public void EndLoadRow()  
  13. {  
  14.     try  
  15.     {  
  16.         if (m_command != null)  
  17.             m_command.Dispose();  
  18.  
  19.         if (m_transaction != null)  
  20.         {  
  21.             m_transaction.Commit();  
  22.         }  
  23.  
  24.         if (m_connection != null)  
  25.         {  
  26.             m_connection.Close();  
  27.             m_connection.Dispose();  
  28.         }  
  29.     }  
  30.     catch (System.Exception ex)  
  31.     {  
  32.         LogHandle.Error(ex);  
  33.     }  

LoadTable函數內部也是調用BeginLoadRow·EndLoadRow模式來完成的。

數據庫文件如何創建:

Sqlite數據庫文件如果不存在,在執行sql語句的時候,會自動根據ConnetionString中指定的位置創建數據庫文件,默認創建的空數據庫只有4K。

其他有待討論的問題:

1、我是將所有的緩存做到一個數據庫文件中了,實際應用根據業務的不同,可以一份緩存數據一個文件也是很好管理的,維護也方便,資源管理器中就可以拷貝刪除等。

2、當我們存儲一億條數據到Sqlite的時候,因為Sqlite沒有壓縮數據,結果數據庫文件就可以會有好幾個G(這也不一定,適合數據庫字段的多少,字段類型有關的)。

文件太大就消耗了磁盤空間,而且用戶或者程序如果不及時清理的,可能會耗盡磁盤空間。

這里就必須建立一個機制,檢查sqlite的緩存并及時清理,或者設置緩存應用的上限,當達到上限后自動根據時間戳清理歷史緩存。

原文鏈接:http://www.cnblogs.com/TeckyLi/archive/2011/02/17/1957317.html

責任編輯:彭凡 來源: 博客園
相關推薦

2010-09-25 13:51:46

2011-07-03 23:27:01

SEO

2010-09-26 15:37:34

制定數據加密項目

2010-09-27 14:18:34

2015-04-22 15:14:38

JavaScriptJavaScript數

2011-04-29 12:54:00

筆記本

2011-03-09 09:24:18

2018-07-04 05:51:04

弱電系統線路故障

2010-03-01 14:13:06

2018-09-13 22:49:36

數據中心機房網絡

2009-10-12 15:56:31

綜合布線系統線纜

2009-07-16 10:35:34

iBATIS特性

2011-11-14 09:58:33

2016-03-17 09:46:53

2011-04-01 15:09:56

Java

2020-03-22 11:04:33

ITOps安全IT運營安全IT安全

2013-01-07 15:05:09

2010-04-23 16:04:48

Oracle查詢優化

2013-10-16 16:03:10

虛擬化

2011-09-06 16:21:16

路由器分類路由器
點贊
收藏

51CTO技術棧公眾號

欧美亚洲黄色片| 114国产精品久久免费观看| 欧美激情aaa| 欧美亚洲二区| 亚洲国产乱码最新视频| 久久青青草综合| 国产欧美日韩成人| 亚洲女人av| 美女视频久久黄| 给我看免费高清在线观看| 涩涩涩久久久成人精品| 亚洲欧美激情小说另类| 久久久久久久免费| 国产特黄一级片| 久久精品观看| 欧美激情xxxx| 成年人二级毛片| 色综合综合色| 亚洲国产小视频| 亚洲精品乱码久久久久久动漫| 在线看片福利| 亚洲成人在线观看视频| 尤物一区二区三区| 欧美日韩视频精品二区| 国产成人av在线影院| 国产欧美日韩高清| 99久久久无码国产精品免费蜜柚| 国产一区清纯| 欧美成人h版在线观看| 国产熟女一区二区| 女人丝袜激情亚洲| 日韩va亚洲va欧洲va国产| 自拍一级黄色片| 四虎永久精品在线| 欧美色窝79yyyycom| www.中文字幕在线| 欧美亚洲日本精品| 午夜精品福利在线| 国产免费一区二区视频| av免费网站在线| 亚洲日本va午夜在线影院| 日韩免费三级| 国产在线一在线二| 久久精品日产第一区二区三区高清版 | 午夜亚洲性色视频| 性欧美在线看片a免费观看| 精品人妻伦九区久久aaa片| 日韩欧美中文| 色小说视频一区| 免费黄色在线网址| 第一会所亚洲原创| 日韩在线视频观看| 999精品在线视频| 午夜片欧美伦| 免费不卡欧美自拍视频| 性色av无码久久一区二区三区| 国产电影一区二区在线观看| 精品久久久av| 可以直接看的黄色网址| 欧美日韩国产综合网| 欧美激情啊啊啊| 日本少妇毛茸茸高潮| 在线亚洲伦理| 国产精品成熟老女人| 一区二区视频网站| 国产一区二区三区国产| 999视频在线观看| 黄色av网址在线| 97se亚洲国产综合自在线| 欧美激情专区| 日本a在线播放| 亚洲日韩欧美一区二区在线| 国产精品自拍合集| 欧美久久天堂| 日韩欧美中文免费| 99热手机在线| 日韩不卡在线视频| 精品无人区太爽高潮在线播放| 亚洲第一成人网站| 欧美韩日高清| 欧美黄色片免费观看| 香蕉影院在线观看| 久久精品国产亚洲高清剧情介绍| 91av免费看| 欧美 日韩 综合| 久久理论电影网| 影音先锋欧美资源| 欧美男男激情videos| 欧美三区在线观看| 熟女人妻一区二区三区免费看| 天堂成人娱乐在线视频免费播放网站| 亚洲丝袜在线视频| 欧美三级 欧美一级| 久久大逼视频| 亚洲精品日产aⅴ| 男人天堂综合| 亚洲男人的天堂在线观看| 国产成人无码a区在线观看视频| 韩日精品一区| 欧美大片拔萝卜| 能直接看的av| 在线欧美不卡| 国产日韩精品综合网站| 天天操天天干天天操| 中文字幕一区二区在线播放| 免费毛片网站在线观看| 亚洲日本免费电影| 美女91精品| 色综合中文网| 精品国产3级a| 我想看黄色大片| 阿v天堂2017| 亚洲激情六月丁香| 国产精品av免费| 国产免费拔擦拔擦8x高清在线人| 欧美日韩另类国产亚洲欧美一级| 捆绑裸体绳奴bdsm亚洲| 忘忧草精品久久久久久久高清| 国产91免费看片| 天天色综合av| 亚洲精品日韩专区silk| xxxx在线免费观看| 欧美日韩爱爱| 国产91成人在在线播放| 亚洲第一天堂在线观看| 国产精品电影一区二区三区| 成人免费观看毛片| 精品亚洲自拍| 九九久久久久99精品| 艳妇乳肉豪妇荡乳av| 26uuu亚洲综合色欧美| 久无码久无码av无码| 国产精品国产三级在线观看| 最近2019年好看中文字幕视频 | 国产免费一区二区三区在线观看| 三级在线电影| 亚洲大片精品永久免费| 在线播放国产视频| 欧美一区免费| 18成人免费观看网站下载| 黄色在线免费网站| 69久久99精品久久久久婷婷 | 日韩美女视频中文字幕| 色av男人的天堂免费在线| 大片免费在线看视频| 欧美午夜影院在线视频| 亚洲黄色免费在线观看| 亚洲国产日韩在线| 高清国产一区| 好看的中文字幕在线播放| 日韩女同互慰一区二区| 久久久久久久九九九九| 懂色av一区二区三区免费观看| 国产资源第一页| 伊人久久亚洲| 久久久久久久久网站| 精品人妻少妇AV无码专区| 一区二区日韩av| 深夜视频在线观看| 国产欧美短视频| 欧美精品一区二区三区四区五区| 丁香六月综合| 中文一区二区视频| 99久久国产热无码精品免费| 一区二区成人在线视频| 第一页在线视频| 亚洲经典三级| 日韩在线国产| 国产精品久久久久久久久久辛辛| 色综合久久天天综线观看| 亚洲精品久久久蜜桃动漫 | 亚洲网站免费观看| ㊣最新国产の精品bt伙计久久| 肉色超薄丝袜脚交| 一区二区亚洲| 日韩国产精品一区二区| 国产一区二区三区免费观看在线| 美女久久久久久久| 日韩在线免费看| 欧美三级中文字| 九九热国产在线| 91蜜桃视频在线| 色播五月激情五月| 最新日韩在线| 午夜视频久久久| 一区中文字幕| 国产精品成人久久久久| 女囚岛在线观看| 亚洲性夜色噜噜噜7777| 国产高清不卡视频| 一本色道久久综合亚洲aⅴ蜜桃 | 色欧美片视频在线观看在线视频| 少妇高潮一区二区三区喷水| 成人看片黄a免费看在线| www.欧美日本| 亚洲精品激情| 一区二区视频在线播放| 九九热播视频在线精品6| 国产精品一区二区性色av | 五月天国产精品| 久久久久99精品成人| 成人一区二区三区| 激情 小说 亚洲 图片: 伦| 影音先锋久久精品| 一区二区三区三区在线| 偷窥自拍亚洲色图精选| 91在线看网站| 韩国精品视频在线观看| 欧美一级黄色网| 最新av在线播放| 中文字幕九色91在线| 熟妇高潮一区二区三区| 337p亚洲精品色噜噜| 中文字幕一区二区人妻电影| 一区二区三区.www| 黄色录像一级片| 国产欧美日韩另类视频免费观看| bl动漫在线观看| 国产精品白丝av| 国产精品嫩草影院8vv8| 首页国产欧美日韩丝袜| 丰满少妇久久久| 欧美视频在线观看| 在线视频一区观看| 欧美亚洲国产精品久久| 久久综合九色99| 麻豆视频一区| 成人做爰66片免费看网站| 国产精品久久久久久久久久久久久久久 | 欧美一级高清片| 91精品在线视频观看| 在线日韩一区二区| 亚洲 欧美 中文字幕| 天天影视网天天综合色在线播放| 国产在线综合网| 一区二区成人在线视频| 麻豆视频在线观看| 亚洲久草在线视频| 国产免费无码一区二区视频| 国产精品乱码久久久久久| 成年人看的免费视频| 欧美国产欧美综合| 成人性生交大片免费看无遮挡aⅴ| 99久久久久久99| 精品人妻一区二区三区香蕉| 99re视频精品| 亚洲一区二区三区日韩 | 放荡的美妇在线播放| 综合精品久久久| 性欧美疯狂猛交69hd| 一区在线观看免费| 日韩一区二区三区四区在线| 亚洲欧美成人一区二区三区| 免费一级肉体全黄毛片| 亚洲国产一区二区视频| 日本va欧美va国产激情| 一本久久综合亚洲鲁鲁五月天| 狠狠人妻久久久久久综合| 在线观看日韩高清av| 又骚又黄的视频| 欧美放荡的少妇| 国产91绿帽单男绿奴| 亚洲精品乱码久久久久久金桔影视 | 高潮毛片又色又爽免费| 欧美日韩亚洲综合在线 欧美亚洲特黄一级| 中文字幕一区二区三区免费看| 欧美人与禽zozo性伦| 国产成人精品av在线观| 亚洲国产精品久久久| 免费黄色在线视频网站| 色老头一区二区三区在线观看| 精品麻豆一区二区三区| 欧美精品第一页在线播放| 制服丝袜专区在线| 国产精品一区二区三区成人| 8848成人影院| 欧美高清性xxxxhdvideosex| 香蕉久久网站| 成人黄色av片| 免费观看30秒视频久久| 深夜视频在线观看| 久久综合九色综合久久久精品综合| 成人激情五月天| 亚洲综合偷拍欧美一区色| 国产精品视频免费播放| 欧美巨大另类极品videosbest | 91亚洲精品在看在线观看高清| 国产精品毛片一区视频| 黄色不卡一区| 大荫蒂性生交片| 欧美bbbbb| 中国xxxx性xxxx产国| 国产精品天美传媒| 五月天综合在线| 777奇米四色成人影色区| 台湾av在线二三区观看| 欧美精品一区二区免费| 国模视频一区| 国产精品对白刺激久久久| 日韩成人综合| 亚洲国产精品久久久久爰色欲| 久久激五月天综合精品| 熟妇高潮精品一区二区三区| 亚洲人成人一区二区在线观看 | 91精品久久久久久久久99蜜臂| 人妻无码中文字幕| 久久精品国产一区| 成人线上视频| 国产精品一区二区三区在线 | 亚洲精品观看| 正在播放一区| 日韩精品电影在线| yy6080午夜| 亚洲欧美日韩在线| 中文字幕日日夜夜| 亚洲精品久久久久中文字幕欢迎你 | 国产精品亚洲欧美在线播放| 亚洲性69xxxbbb| 波多野结衣亚洲一二三| 国产精品一区二区三区免费| 中文在线播放一区二区| gai在线观看免费高清| 中文字幕欧美三区| 午夜精品久久久久久久蜜桃| 精品视频久久久| 久草在线资源福利站| 草莓视频一区| 国产综合亚洲精品一区二| 一级黄色在线播放| 国产精品不卡一区二区三区| 亚洲精品无码久久久久| 亚洲人成电影网站色xx| 中文字幕成在线观看| 激情小说综合网| av成人激情| 性色av蜜臀av色欲av| 香蕉乱码成人久久天堂爱免费| 亚洲精品无遮挡| 久久久久久网站| 国内精品偷拍| 青青青免费在线| k8久久久一区二区三区| 日韩在线视频免费播放| 亚洲精品久久久久久久久久久久久| 九九色在线视频| 国产精品乱码视频| 99国产精品视频免费观看一公开| 国产ts丝袜人妖系列视频| 精品日韩美女的视频高清| 麻豆app在线观看| 国产成人涩涩涩视频在线观看 | 中文字幕在线日本| 国产一区二区免费| 草莓视频成人appios| 最新精品视频| 国产麻豆午夜三级精品| 激情五月婷婷小说| 亚洲级视频在线观看免费1级| 竹内纱里奈兽皇系列在线观看| 免费电影一区| 另类小说视频一区二区| 青青青在线免费观看| 精品女同一区二区| 伊人久久视频| 亚洲区一区二区三区| 韩国成人福利片在线播放| 久久这里只有精品国产| 亚洲精品国产成人| 91av一区| 91免费版看片| 91亚洲精品一区二区乱码| 国产精品无码一区| 美女少妇精品视频| 人体久久天天| 超碰在线97免费| 一区二区在线观看免费| 四虎精品成人影院观看地址| 国产精品视频自拍| 激情久久五月| 成人在线观看免费高清| 日韩精品中文字幕一区二区三区| 国产一二三在线| 樱花www成人免费视频| 成人国产免费视频| 中文字幕一区二区在线视频| 欧美激情a在线| 日本不卡高清| 国模私拍在线观看| 欧美性猛交一区二区三区精品| 超碰电影在线播放| 麻豆av一区| 国产成人精品aa毛片| 中文字幕在线天堂| 欧美激情极品视频| 日韩一区二区在线| 污片免费在线观看| 69精品人人人人| 日韩在线短视频| 97超碰在线人人| 国产精品日韩精品欧美在线|