青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

隨筆-30  評論-67  文章-0  trackbacks-0
  2008年1月11日
1) 添加遠程用戶登陸權限
  系統(tǒng)提示符下 mysql --user=root -p
   use mysql
GRANT ALL PRIVILEGES ON *.* TO root@finapp IDENTIFIED BY "123"
grant all privieges on database.table to user@IpOrName identified by "password"







posted @ 2008-01-11 09:55 含笑半步癲 閱讀(705) | 評論 (0)編輯 收藏
  2008年1月9日
作者:andyao
原文link: http://andyao.javaeye.com/admin/show/144033
轉載請留名

1. 簡介
在Web應用程序體系架構中,數(shù)據(jù)持久層(通常是一個關系數(shù)據(jù)庫)是關鍵的核心部分,它對系統(tǒng)的性能有非常重要的影響。MySQL是目前使用最多的開源數(shù)據(jù)庫,但是MySQL數(shù)據(jù)庫的默認設置性能非常的差,僅僅是一個玩具數(shù)據(jù)庫。因此在產品中使用MySQL數(shù)據(jù)庫必須進行必要的優(yōu)化。
優(yōu)化是一個復雜的任務,本文描述MySQL相關的數(shù)據(jù)庫設計和查詢優(yōu)化,服務器端優(yōu)化,存儲引擎優(yōu)化。

2. 數(shù)據(jù)庫設計和查詢優(yōu)化
在MySQL Server性能調優(yōu)中,首先要考慮的就是Database Schema設計,這一點是非常重要的。一個糟糕的Schema設計即使在性能調優(yōu)的MySQL Server上運行,也會表現(xiàn)出很差的性能;和Schema相似,查詢語句的設計也會影響MySQL的性能,應該避免寫出低效的SQL查詢。這一節(jié)將詳細討論這兩方面的優(yōu)化。

2.1 Schema Design
Schema的優(yōu)化取決于將要運行什么樣的query,不同的query會有不同的Schema優(yōu)化方案。2.2節(jié)將介紹Query Design的優(yōu)化。Schema設計同樣受到預期數(shù)據(jù)集大小的影響。Schema設計時主要考慮:標準化,數(shù)據(jù)類型,索引。

2.1.1 標準化

標準化是在數(shù)據(jù)庫中組織數(shù)據(jù)的過程。其中包括,根據(jù)設計規(guī)則創(chuàng)建表并在這些表間建立關系;通過取消冗余度與不一致相關性,該設計規(guī)則可以同時保護數(shù)據(jù)并提高數(shù)據(jù)的靈活性。通常數(shù)據(jù)庫標準化是讓數(shù)據(jù)庫設計符合某一級別的范式,通常滿足第三范式即可。也有第四范式(也稱為 Boyce Codd范式,BCNF))與第五范式存在,但是在實際設計中很少考慮。忽視這些規(guī)則可能使得數(shù)據(jù)庫的設計不太完美,但這不應影響功能。
標準化的特點:
1) 所有的“對象”都在它自己的table中,沒有冗余。
2) 數(shù)據(jù)庫通常由E-R圖生成。
3) 簡潔,更新屬性通常只需要更新很少的記錄。
4) Join操作比較耗時。
5) Select,sort優(yōu)化措施比較少。
6) 適用于OLTP應用。
非標準化的特點:
1) 在一張表中存儲很多數(shù)據(jù),數(shù)據(jù)冗余。
2) 更新數(shù)據(jù)開銷很大,更新一個屬性可能會更新很多表,很多記錄。
3) 在刪除數(shù)據(jù)是有可能丟失數(shù)據(jù)。
4) Select,order有很多優(yōu)化的選擇。
5) 適用于DSS應用。

標準化和非標準化都有各自的優(yōu)缺點,通常在一個數(shù)據(jù)庫設計中可以混合使用,一部分表格標準化,一部分表格保留一些冗余數(shù)據(jù):
1) 對OLTP使用標準化,對DSS使用非標準化
2) 使用物化視圖。MySQL不直接支持該數(shù)據(jù)庫特性,但是可以用MyISAM表代替。
3) 冗余一些數(shù)據(jù)在表格中,例如將ref_id和name存在同一張表中。但是要注意更新問題。
4) 對于一些簡單的對象,直接使用value作為建。例如IP address等
5) Reference by PRIMARY/UNIQUE KEY。MySQL可以優(yōu)化這種操作,例如:
java 代碼
  1. select city_name
  2. from city,state
  3. where state_id=state.id and state.code=‘CA’” converted to “select city_name from city where state_id=12

2.1.2 數(shù)據(jù)類型
最基本的優(yōu)化之一就是使表在磁盤上占據(jù)的空間盡可能小。這能帶來性能非常大的提升,因為數(shù)據(jù)小,磁盤讀入較快,并且在查詢過程中表內容被處理所占用的內存更少。同時,在更小的列上建索引,索引也會占用更少的資源。
可以使用下面的技術可以使表的性能更好并且使存儲空間最小:
1) 使用正確合適的類型,不要將數(shù)字存儲為字符串。
2) 盡可能地使用最有效(最小)的數(shù)據(jù)類型。MySQL有很多節(jié)省磁盤空間和內存的專業(yè)化類型。
3) 盡可能使用較小的整數(shù)類型使表更小。例如,MEDIUMINT經常比INT好一些,因為MEDIUMINT列使用的空間要少25%。
4) 如果可能,聲明列為NOT NULL。它使任何事情更快而且每列可以節(jié)省一位。注意如果在應用程序中確實需要NULL,應該毫無疑問使用它,只是避免 默認地在所有列上有它。
5) 對于MyISAM表,如果沒有任何變長列(VARCHAR、TEXT或BLOB列),使用固定尺寸的記錄格式。這比較快但是不幸地可能會浪費一些空間。即使你已經用CREATE選項讓VARCHAR列ROW_FORMAT=fixed,也可以提示想使用固定長度的行。
6) 使用sample character set,例如latin1。盡量少使用utf-8,因為utf-8占用的空間是latin1的3倍。可以在不需要使用utf-8的字段上面使用latin1,例如mail,url等。

2.1.3 索引
所有MySQL列類型可以被索引。對相關列使用索引是提高SELECT操作性能的最佳途徑。使用索引應該注意以下幾點:
1) MySQL只會使用前綴,例如key(a, b) …where b=5 將使用不到索引。
2) 要選擇性的使用索引。在變化很少的列上使用索引并不是很好,例如性別列。
3) 在Unique列上定義Unique index。
4) 避免建立使用不到的索引。
5) 在Btree index中(InnoDB使用Btree),可以在需要排序的列上建立索引。
6) 避免重復的索引。
7) 避免在已有索引的前綴上建立索引。例如:如果存在index(a,b)則去掉index(a)。
8) 控制單個索引的長度。使用key(name(8))在數(shù)據(jù)的前面幾個字符建立索引。
9) 越是短的鍵值越好,最好使用integer。
10) 在查詢中要使用到索引(使用explain查看),可以減少讀磁盤的次數(shù),加速讀取數(shù)據(jù)。
11) 相近的鍵值比隨機好。Auto_increment就比uuid好。
12) Optimize table可以壓縮和排序index,注意不要頻繁運行。
13) Analyze table可以更新數(shù)據(jù)。
2.2 Designing queries
查詢語句的優(yōu)化是一個Case by case的問題,不同的sql有不同的優(yōu)化方案,在這里我只列出一些通用的技巧。
1) 在有index的情況下,盡量保證查詢使用了正確的index。可以使用EXPLAIN select …查看結果,分析查詢。
2) 查詢時使用匹配的類型。例如select * from a where id=5, 如果這里id是字符類型,同時有index,這條查詢則使用不到index,會做全表掃描,速度會很慢。正確的應該是 … where id=”5” ,加上引號表明類型是字符。
3) 使用--log-slow-queries –long-query-time=2查看查詢比較慢的語句。然后使用explain分析查詢,做出優(yōu)化。
3. 服務器端優(yōu)化
3.1 MySQL安裝
MySQL有很多發(fā)行版本,最好使用MySQL AB發(fā)布的二進制版本。也可以下載源代碼進行編譯安裝,但是編譯器和類庫的一些bug可能會使編譯完成的MySQL存在潛在的問題。
如果安裝MySQL的服務器使用的是Intel公司的處理器,可以使用intel c++編譯的版本,在Linux World2005的一篇PPT中提到,使用intel C++編譯器編譯的MySQL查詢速度比正常版本快30%左右。Intel c++編譯版本可以在MySQL官方網站下載。

3.2 服務器設置優(yōu)化
MySQL默認的設置性能很差,所以要做一些參數(shù)的調整。這一節(jié)介紹一些通用的參數(shù)調整,不涉及具體的存儲引擎(主要指MyISAM,InnoDB,相關優(yōu)化在4中介紹)。
--character-set:如果是單一語言使用簡單的character set例如latin1。盡量少用Utf-8,utf-8占用空間較多。
--memlock:鎖定MySQL只能運行在內存中,避免swapping,但是如果內存不夠時有可能出現(xiàn)錯誤。
--max_allowed_packet:要足夠大,以適應比較大的SQL查詢,對性能沒有太大影響,主要是避免出現(xiàn)packet錯誤。
--max_connections:server允許的最大連接。太大的話會出現(xiàn)out of memory。
--table_cache:MySQL在同一時間保持打開的table的數(shù)量。打開table開銷比較大。一般設置為512。
--query_cache_size: 用于緩存查詢的內存大小。
--datadir:mysql存放數(shù)據(jù)的根目錄,和安裝文件分開在不同的磁盤可以提高一點性能。
4. 存儲引擎優(yōu)化
MySQL支持不同的存儲引擎,主要使用的有MyISAM和InnoDB。

4.1 MyISAM
MyISAM管理非事務表。它提供高速存儲和檢索,以及全文搜索能力。MyISAM在所有MySQL配置里被支持,它是默認的存儲引擎,除非配置MySQL默認使用另外一個引擎。

4.1.1 MyISAM特性
4.1.1.1 MyISAM Properties
1) 不支持事務,宕機會破壞表
2) 使用較小的內存和磁盤空間
3) 基于表的鎖,并發(fā)更新數(shù)據(jù)會出現(xiàn)嚴重性能問題
4) MySQL只緩存Index,數(shù)據(jù)由OS緩存
4.1.1.2 Typical MyISAM usages
1) 日志系統(tǒng)
2) 只讀或者絕大部分是讀操作的應用
3) 全表掃描
4) 批量導入數(shù)據(jù)
5) 沒有事務的低并發(fā)讀/寫
4.1.2 MyISAM優(yōu)化要點
1) 聲明列為NOT NULL,可以減少磁盤存儲。
2) 使用optimize table做碎片整理,回收空閑空間。注意僅僅在非常大的數(shù)據(jù)變化后運行。
3) Deleting/updating/adding大量數(shù)據(jù)的時候禁止使用index。使用ALTER TABLE t DISABLE KEYS。
4) 設置myisam_max_[extra]_sort_file_size足夠大,可以顯著提高repair table的速度。
4.1.3 MyISAM Table Locks
1) 避免并發(fā)insert,update。
2) 可以使用insert delayed,但是有可能丟失數(shù)據(jù)。
3) 優(yōu)化查詢語句。
4) 水平分區(qū)。
5) 垂直分區(qū)。
6) 如果都不起作用,使用InnoDB。
4.1.4 MyISAM Key Cache
1) 設置key_buffer_size variable。MyISAN最主要的cache設置,用于緩存MyISAM表格的index數(shù)據(jù),該參數(shù)只對MyISAM有影響。通常在只使用MyISAM的Server中設置25-33%的內存大小。
2) 可以使用幾個不同的Key Caches(對一些hot data)。
a) SET GLOBAL test.key_buffer_size=512*1024;
b) CACHE INDEX t1.i1, t2.i1, t3 IN test;
2) Preload index到Cache中可以提高查詢速度。因為preloading index是順序的,所以非常快。
a) LOAD INDEX INTO CACHE t1, t2 IGNORE LEAVES;

4.2 InnoDB
InnoDB給MySQL提供了具有提交,回滾和崩潰恢復能力的事務安全(ACID兼容)存儲引擎。InnoDB提供row level lock,并且也在SELECT語句提供一個Oracle風格一致的非鎖定讀。這些特色增加了多用戶部署和性能。沒有在InnoDB中擴大鎖定的需要,因為在InnoDB中row level lock適合非常小的空間。InnoDB也支持FOREIGN KEY約束。在SQL查詢中,你可以自由地將InnoDB類型的表與其它MySQL的表的類型混合起來,甚至在同一個查詢中也可以混合。
InnoDB是為在處理巨大數(shù)據(jù)量時獲得最大性能而設計的。它的CPU使用效率非常高。
InnoDB存儲引擎已經完全與MySQL服務器整合,InnoDB存儲引擎為在內存中緩存數(shù)據(jù)和索引而維持它自己的緩沖池。 InnoDB存儲它的表&索引在一個表空間中,表空間可以包含數(shù)個文件(或原始磁盤分區(qū))。這與MyISAM表不同,比如在MyISAM表中每個表被存在分離的文件中。InnoDB 表可以是任何大小,即使在文件尺寸被限制為2GB的操作系統(tǒng)上。
許多需要高性能的大型數(shù)據(jù)庫站點上使用了InnoDB引擎。著名的Internet新聞站點Slashdot.org運行在InnoDB上。 Mytrix, Inc.在InnoDB上存儲超過1TB的數(shù)據(jù),還有一些其它站點在InnoDB上處理平均每秒800次插入/更新的負荷。
4.2.1 InnoDB特性
4.2.1.1 InnoDB Properties
1) 支持事務,ACID,外鍵。
2) Row level locks。
3) 支持不同的隔離級別。
4) 和MyISAM相比需要較多的內存和磁盤空間。
5) 沒有鍵壓縮。
6) 數(shù)據(jù)和索引都緩存在內存hash表中。
4.2.1.2 InnoDB Good For
1) 需要事務的應用。
2) 高并發(fā)的應用。
3) 自動恢復。
4) 較快速的基于主鍵的操作。
4.2.2 InnoDB優(yōu)化要點
1) 盡量使用short,integer的主鍵。
2) Load/Insert數(shù)據(jù)時按主鍵順序。如果數(shù)據(jù)沒有按主鍵排序,先排序然后再進行數(shù)據(jù)庫操作。
3) 在Load數(shù)據(jù)是為設置SET UNIQUE_CHECKS=0,SET FOREIGN_KEY_CHECKS=0,可以避免外鍵和唯一性約束檢查的開銷。
4) 使用prefix keys。因為InnoDB沒有key壓縮功能。
4.2.3 InnoDB服務器端設定
innodb_buffer_pool_size:這是InnoDB最重要的設置,對InnoDB性能有決定性的影響。默認的設置只有8M,所以默認的數(shù)據(jù)庫設置下面InnoDB性能很差。在只有InnoDB存儲引擎的數(shù)據(jù)庫服務器上面,可以設置60-80%的內存。更精確一點,在內存容量允許的情況下面設置比InnoDB tablespaces大10%的內存大小。

innodb_data_file_path:指定表數(shù)據(jù)和索引存儲的空間,可以是一個或者多個文件。最后一個數(shù)據(jù)文件必須是自動擴充的,也只有最后一個文件允許自動擴充。這樣,當空間用完后,自動擴充數(shù)據(jù)文件就會自動增長(以8MB為單位)以容納額外的數(shù)據(jù)。例如: innodb_data_file_path=/disk1/ibdata1:900M;/disk2/ibdata2:50M:autoextend兩個數(shù)據(jù)文件放在不同的磁盤上。數(shù)據(jù)首先放在ibdata1中,當達到900M以后,數(shù)據(jù)就放在ibdata2中。一旦達到50MB,ibdata2將以8MB為單位自動增長。如果磁盤滿了,需要在另外的磁盤上面增加一個數(shù)據(jù)文件。

innodb_data_home_dir:放置表空間數(shù)據(jù)的目錄,默認在mysql的數(shù)據(jù)目錄,設置到和MySQL安裝文件不同的分區(qū)可以提高性能。

innodb_log_file_size:該參數(shù)決定了recovery speed。太大的話recovery就會比較慢,太小了影響查詢性能,一般取256M可以兼顧性能和recovery的速度

innodb_log_buffer_size:磁盤速度是很慢的,直接將log寫道磁盤會影響InnoDB的性能,該參數(shù)設定了log buffer的大小,一般4M。如果有大的blob操作,可以適當增大。

innodb_flush_logs_at_trx_commit=2: 該參數(shù)設定了事務提交時內存中l(wèi)og信息的處理。
1) =1時,在每個事務提交時,日志緩沖被寫到日志文件,對日志文件做到磁盤操作的刷新。Truly ACID。速度慢。
2) =2時,在每個事務提交時,日志緩沖被寫到文件,但不對日志文件做到磁盤操作的刷新。只有操作系統(tǒng)崩潰或掉電才會刪除最后一秒的事務,不然不會丟失事務。
3) =0時, 日志緩沖每秒一次地被寫到日志文件,并且對日志文件做到磁盤操作的刷新。任何mysqld進程的崩潰會刪除崩潰前最后一秒的事務
innodb_file_per_table:可以存儲每個InnoDB表和它的索引在它自己的文件中。

transaction-isolation=READ-COMITTED: 如果應用程序可以運行在READ-COMMITED隔離級別,做此設定會有一定的性能提升。

innodb_flush_method: 設置InnoDB同步IO的方式:
1) Default – 使用fsync()。
2) O_SYNC 以sync模式打開文件,通常比較慢。
3) O_DIRECT,在Linux上使用Direct IO。可以顯著提高速度,特別是在RAID系統(tǒng)上。避免額外的數(shù)據(jù)復制和double buffering(mysql buffering 和OS buffering)。
innodb_thread_concurrency: InnoDB kernel最大的線程數(shù)。
1) 最少設置為(num_disks+num_cpus)*2。
2) 可以通過設置成1000來禁止這個限制
5. 緩存
緩存有很多種,為應用程序加上適當?shù)木彺娌呗詴@著提高應用程序的性能。由于應用緩存是一個比較大的話題,所以這一部分還需要進一步調研。

6. Reference
1) http://www.mysqlperformanceblog.com/
2) Advanced MySQL Performance Optimization, Peter Zaitsev, Tobias Asplund, MySQL Users Conference 2005
3) Improving MySQL Server Performance with Intel C++ Compiler,Peter Zaitsev,Linux World 2005
4) MySQL Performance Optimization, Peter Zaitsev, Percona Ltd, OPEN SOURCE DATABASE CONFERENCE 2006
5) MySQL Server Settings Tuning, Peter Zaitsev, co-founder, Percona Ltd, 2007
6) MySQL Reference Manual
posted @ 2008-01-09 23:52 含笑半步癲 閱讀(877) | 評論 (0)編輯 收藏
  2008年1月5日



編譯HelloWorld類
 1 public class HelloWorld {
 2     public native void displayHelloWorld();
 3 
 4     public native void printxx(String str);
 5 
 6     static {
 7         System.loadLibrary("hello");
 8         // System.load("hello");
 9     }
10 
11     public static void main(String[] args) {
12         HelloWorld hw = new HelloWorld();
13         hw.displayHelloWorld();
14         for (int i = 0;; ++i) {
15             hw
16                     .printxx("wo kaowo kaowo kaowo kaowo kaowo kaowo kaowo kaowo kaowo kaowo kao");
17             if (i % 1000 == 0) {
18                 try {
19                     Thread.sleep(10);
20                 } catch (InterruptedException e) {
21                 }
22             }
23         }
24     }
25 }

對編譯完的class執(zhí)行
javah HelloWorld

 1 /* DO NOT EDIT THIS FILE - it is machine generated */
 2 #include <jni.h>
 3 /* Header for class HelloWorld */
 4 
 5 #ifndef _Included_HelloWorld
 6 #define _Included_HelloWorld
 7 #ifdef __cplusplus
 8 extern "C" {
 9 #endif
10 /*
11  * Class:     HelloWorld
12  * Method:    displayHelloWorld
13  * Signature: ()V
14  */
15 JNIEXPORT void JNICALL Java_HelloWorld_displayHelloWorld
16   (JNIEnv *, jobject);
17 
18 /*
19  * Class:     HelloWorld
20  * Method:    printxx
21  * Signature: (Ljava/lang/String;)V
22  */
23 JNIEXPORT void JNICALL Java_HelloWorld_printxx
24   (JNIEnv *, jobject, jstring);
25 
26 #ifdef __cplusplus
27 }
28 #endif
29 #endif
30 

編譯
cl -I%java_home%\include -I%java_home%\include\win32 -LDHelloWorld.c -Fehello.dll

 1 #include <jni.h>
 2 #include "HelloWorld.h"
 3 #include <stdio.h>
 4 JNIEXPORT void JNICALL Java_HelloWorld_displayHelloWorld(JNIEnv *env, jobject obj)
 5 {
 6 printf("Hello world!\n"); 
 7 return;
 8 }
 9 
10 JNIEXPORT void JNICALL Java_HelloWorld_printxx
11   (JNIEnv *env, jobject obj, jstring prompt){
12 
13 const char *str = (*env)->GetStringUTFChars(env, prompt, 0);
14   printf("%s",prompt);
15 (*env)->ReleaseStringUTFChars(env, prompt, str);
16   
17   return;
18   }
19   
20   




3.Java類型和本地類型對應
  
  在如下情況下,需要在本地方法中應用java對象的引用,就會用到類型之間的轉換:
  
  1)java方法里面將參數(shù)傳入本地方法;
  
  2)在本地方法里面創(chuàng)建java對象;
  
  3)在本地方法里面return結果給java程序。
  
  分為如下兩種情況:
  
  Java原始類型
  
  像booleans、integers、floats等從Java程序中傳到本地方法中的原始類型可以直接使用,下面是java中的原始類型和本地方法中的類型的對應:
  
  Java類型  本地類型  字節(jié)(bit)
  
  boolean   jboolean   8, unsigned
  byte    jbyte    8
  char    jchar    16, unsigned
  short    jshort    16
  int     jint     32
  long    jlong    64
  float    jfloat    32
  double   jdouble   64
  void    void     n/a
  
  也就是說如果我在方法中傳進去了一個boolean的參數(shù)的話,那么我在本地方法中就有jboolean類型與之對應。同理,如果在本地方法中return一個jint的話,那么在java中就返回一個int類型。 中國網管論壇
  
  Java對象
  
  Java對象做為引用被傳遞到本地方法中,所有這些Java對象的引用都有一個共同的父類型jobject(相當于java中的Object類是所有類的父類一樣)。下面是JNI實現(xiàn)的一些jobject的子類:
  
  4.本地方法中訪問java程序中的內容
  
  1)訪問String對象:
  
  從java程序中傳過去的String對象在本地方法中對應的是jstring類型,jstring類型和c中的char*不同,所以如果你直接當做char*使用的話,就會出錯。因此在使用之前需要將jstring轉換成為c/c++中的char*,這里使用JNIEnv的方法轉換。下面是一個例子:
  
  代碼3:
  
  JNIEXPORT jstring JNICALL Java_Prompt_getLine
  (JNIEnv *env, jobject obj, jstring prompt)
  {
  char buf[128];
  const char *str = (*env)->GetStringUTFChars(env, prompt, 0);
  printf("%s", str);
  (*env)->ReleaseStringUTFChars(env, prompt, str);
  
  這里使用GetStringUTFChars方法將傳進來的prompt(jstring類型)轉換成為UTF-8的格式,就能夠在本地方法中使用了。
  
  注意:在使用完你所轉換之后的對象之后,需要顯示調用ReleaseStringUTFChars方法,讓JVM釋放轉換成UTF-8的string的對象的空間,如果不顯示的調用的話,JVM中會一直保存該對象,不會被垃圾回收器回收,因此就會導致內存溢出。

www.bitsCN.com


  
  下面是訪問String的一些方法:
  
  ◆GetStringUTFChars將jstring轉換成為UTF-8格式的char*
  
  ◆GetStringChars將jstring轉換成為Unicode格式的char*
  
  ◆ReleaseStringUTFChars釋放指向UTF-8格式的char*的指針
  
  ◆ReleaseStringChars釋放指向Unicode格式的char*的指針
  
  ◆NewStringUTF創(chuàng)建一個UTF-8格式的String對象
  
  ◆NewString創(chuàng)建一個Unicode格式的String對象
  
  ◆GetStringUTFLengt獲取UTF-8格式的char*的長度
  
  ◆GetStringLength獲取Unicode格式的char*的長度
  
  2) 訪問Array對象:
  
  和String對象一樣,在本地方法中不能直接訪問jarray對象,而是使用JNIEnv指針指向的一些方法來是用。
  
  訪問Java原始類型數(shù)組:
  
  1)獲取數(shù)組的長度:
  
  代碼4:
  
  JNIEXPORT jint JNICALL Java_IntArray_sumArray
  (JNIEnv *env, jobject obj, jintArray arr)
  {
  int i, sum = 0;
  jsize len = (*env)->GetArrayLength(env, arr);
  
  如代碼4所示,這里獲取數(shù)組的長度和普通的c語言中的獲取數(shù)組長度不一樣,這里使用JNIEvn的一個函數(shù)GetArrayLength。
bitsCN_com

  
  2)獲取一個指向數(shù)組元素的指針:
  
  代碼4:
  
  jint *body = (*env)->GetIntArrayElements(env, arr, 0);
  
  使用GetIntArrayElements方法獲取指向arr數(shù)組元素的指針,注意該函數(shù)的參數(shù),第一個是JNIEnv,第二個是數(shù)組,第三個是數(shù)組里面第三個是數(shù)組里面開始的元素
  
  3)使用指針取出Array中的元素
  
  代碼5:
  
  for (i=0; i<len; i++) {
  sum += body[i];
  }
  
  這里使用就和普通的c中的數(shù)組使用沒有什么不同了
  
  4)釋放數(shù)組元素的引用
  
  代碼6:
  
  (*env)->ReleaseIntArrayElements(env, arr, body, 0);
  
  和操作String中的釋放String的引用是一樣的,提醒JVM回收arr數(shù)組元素的引用。
  
  這里舉的例子是使用int數(shù)組的,同樣還有boolean、float等對應的數(shù)組。
  
  獲取數(shù)組元素指針的對應關系:
  
  函數(shù)            數(shù)組類型
  
  GetBooleanArrayElements   boolean
  GetByteArrayElements    byte
  GetCharArrayElements    char bitsCN.nET中國網管博客
  GetShortArrayElements    short
  GetIntArrayElements     int
  GetLongArrayElements    long
  GetFloatArrayElements    float
  GetDoubleArrayElements   double
  
  釋放數(shù)組元素指針的對應關系:
  Function            Array Type
  ReleaseBooleanArrayElements   boolean
  ReleaseByteArrayElements    byte
  ReleaseCharArrayElements    char
  ReleaseShortArrayElements    short
  ReleaseIntArrayElements     int
  ReleaseLongArrayElements    long
  ReleaseFloatArrayElements    float
  ReleaseDoubleArrayElements   double
  
  訪問自定義Java對象數(shù)組
  
  The JNI provides a separate set of functions to access elements of object arrays. You can use these functions to get and set individual object array elements.
  
  Note: You cannot get all the object array elements at once.
  
  GetObjectArrayElement returns the object element at a given index.
www_bitscn_com

  
  SetObjectArrayElement updates the object element at a given index.
  
  3) 訪問Java對象的方法:
  
  在本地方法中調用Java對象的方法的步驟:
  
  ①.獲取你需要訪問的Java對象的類:
  
  jclass cls = (*env)->GetObjectClass(env, obj);
  
  使用GetObjectClass方法獲取obj對應的jclass。
  
  ②.獲取MethodID:
  
  jmethodID mid = (*env)->GetMethodID(env, cls, "callback", "(I)V");
  
  使用GetMethdoID方法獲取你要使用的方法的MethdoID。其參數(shù)的意義:
  
  env??>JNIEnv
  
  cls??>第一步獲取的jclass
  
  "callback"??>要調用的方法名
  
  "(I)V"??>方法的Signature
  
  ③.調用方法:
  
  (*env)->CallVoidMethod(env, obj, mid, depth);
  
  使用CallVoidMethod方法調用方法。參數(shù)的意義:
  
  env??>JNIEnv
  
  obj??>通過本地方法穿過來的jobject
  
  mid??>要調用的MethodID(即第二步獲得的MethodID)
  
  depth??>方法需要的參數(shù)(對應方法的需求,添加相應的參數(shù)) bitsCN.nET中國網管博客
  
  注:這里使用的是CallVoidMethod方法調用,因為沒有返回值,如果有返回值的話使用對應的方法,在后面會提到。
  
  方法的Signature
  
  方法的Signature是由方法的參數(shù)和返回值的類型共同構成的,下面是他們的結構:
  
  "(argument-types)return-type"
  
  其中Java程序中參數(shù)類型和其對應的值如下:
  
  Signature  Java中的類型
  Z       boolean
  B       byte
  C       char
  S       short
  I       int
  J       long
  F       float
  D       double
  L fully-qualified-class;   fully-qualified-class
  
  [ type  type[]
  
  ( arg-types ) ret-type  method type
  
  一個Java類的方法的Signature可以通過javap命令獲取:
  
  javap -s -p Java類名
  
  給調用的函數(shù)傳參數(shù):
  
  通常我們直接在methodID后面將要傳的參數(shù)添加在后面,但是還有其他的方法也可以傳參數(shù):
  
  CallVoidMethodV可以獲取一個數(shù)量可變的列表作為參數(shù); www_bitscn_com
  
  CallVoidMethodA可以獲取一個union。
  
  調用靜態(tài)方法:
  
  就是將第二步和第三步調用的方法改為對應的:
  
  GetStaticMethodID獲取對應的靜態(tài)方法的ID
  
  CallStaticIntMethod調用靜態(tài)方法
  
  調用超類的方法:
  
  用的比較少,自己看啦。^_^。
  
  4)訪問Java對象的屬性:
  
  訪問Java對象的屬性和訪問Java對象的方法基本上一樣,只需要將函數(shù)里面的Method改為Field即可





posted @ 2008-01-05 16:17 含笑半步癲 閱讀(1012) | 評論 (0)編輯 收藏

qt4 開源版本qt-win-opensource-src-4.3.3

qt官方網站 http://trolltech.com/


解壓qt4。
使用Visual Studio 2008 Command Prompt到命令行模式。
到qt目錄下
cd bin
configure   (很久)
namke   (很久)

建立項目

編輯一個xx.cpp文件
在文件目錄下執(zhí)行
qmake -project
qmake -t vcapp




下面用一個小程序測試一下

創(chuàng)建文件名為hello.cpp,輸入如下代碼:

#include <QApplication>
#include <QLabel>

int main(int argc, char **argv) {
  QApplication app(argc, argv);
  QLabel *label = new QLabel("Hello World!");
 
  label->show();

  return app.exec();
}
然后
prompt> qmake -project -o hello.pro
prompt> qmake
prompt> nmake
就會在debug文件夾下生成一個.exe文件。





qmake
用vs2008打開項目

編輯ui
執(zhí)行bin目錄下的designer.exe
存盤,
uic -o xxx.h xxx.ui
復制到項目下面
執(zhí)行qmake
用vs2008打開


字符串使用gbk編碼(全局)
main函數(shù)加入
QTextCodec::setCodecForTr(QTextCodec::codecForName("GBK"));.

posted @ 2008-01-05 00:07 含笑半步癲 閱讀(2709) | 評論 (0)編輯 收藏
  2008年1月4日
linux bash:

YOUR_LIB=your_path

for jar in `ls $YOUR_LIB/*.jar`
do
      CLASSPATH="$CLASSPATH:""$jar"
done


windows :


SETLOCAL ENABLEDELAYEDEXPANSION
set LIB=xx
set CLASSPATH=.
FOR %%C IN (LIB\*.jar) DO set CLASSPATH=!CLASSPATH!;%%C
echo %CLASSPATH%



unix ksh:
暫無

posted @ 2008-01-04 15:45 含笑半步癲 閱讀(1047) | 評論 (0)編輯 收藏
  2007年1月19日


?

?1?package?test;
?2?
?3?public?class?testClone?{
?4?????volatile?boolean?isInit;
?5?
?6?????volatile?Foo?foo;
?7?
?8?????volatile?int?time?=?1;
?9?
10?????public?class?Foo?{
11?????????volatile?int?flg;
12?
13?????????public?Foo()?{
14?????????????flg?=?0;
15?????????????try?{
16?????????????????Thread.sleep(time);
17?????????????}?catch?(InterruptedException?e)?{
18?????????????}
19?????????????++flg;
20?????????????System.out.println("Foo?inited");
21?????????}
22?????}
23?
24?????public?static?void?main(String[]?args)?throws?InterruptedException?{
25?????????testClone?t?=?new?testClone();
26?????????t.test();
27?????}
28?
29?????public?void?test()?{
30?????????for?(int?i?=?0;?i?<?5;?++i)?{
31?????????????WorkThread?t?=?new?WorkThread();
32?????????????t.start();
33?????????}
34?
35?????????for?(;;)?{
36?????????????try?{
37?????????????????Thread.sleep(1000);
38?????????????}?catch?(InterruptedException?e)?{
39?????????????}
40?????????????time?=?1000;
41?????????????synchronized?(this)?{
42?????????????????foo?=?null;
43?????????????}
44?????????}
45?????}
46?
47?????public?Foo?bar()?{
48?????????Foo?f?=?foo;
49?????????if?(f?==?null)?{
50?????????????synchronized?(this)?{
51?????????????????if?(foo?==?null)?{
52?????????????????????foo?=?new?Foo();
53?????????????????}
54?????????????????return?foo;
55?????????????}
56?????????}
57?????????return?f;
58?????}
59?
60?????public?class?WorkThread?extends?Thread?{
61?????????public?void?run()?{
62?????????????for?(;;)?{
63?????????????????try?{
64?
65?????????????????????Foo?f?=?bar();
66?????????????????????if?(f.flg?==?0)?{
67?????????????????????????System.out.println(f.flg);
68?????????????????????}
69?????????????????}?catch?(Throwable?e)?{
70?????????????????????e.printStackTrace();
71?????????????????}
72?????????????}
73?????????}
74?????}
75?}
76?



1.4.2jdk編譯執(zhí)行。長時間執(zhí)行沒有發(fā)現(xiàn)有網上所說的由于jit優(yōu)化導致的當分配完Foo的內存,F(xiàn)oo構造函數(shù)未初始化完成就將其地址賦值給foo的錯誤。相信這時候jit已經對代碼進行了優(yōu)化。

國外網址關于Double-Checked Locking的文章http://www.cs.umd.edu/~pugh/java/memoryModel/DoubleCheckedLocking.html

A test case showing that it doesn't work

Paul Jakubik found an example of a use of double-checked locking that did not work correctly. A slightly cleaned up version of that code is available here.

When run on a system using the Symantec JIT, it doesn't work. In particular, the Symantec JIT compiles

singletons[i].reference = new Singleton();

to the following (note that the Symantec JIT using a handle-based object allocation system).

0206106A   mov         eax,0F97E78h
0206106F   call        01F6B210                  ; allocate space for
                                                 ; Singleton, return result in eax
02061074   mov         dword ptr [ebp],eax       ; EBP is &singletons[i].reference 
                                                ; store the unconstructed object here.
02061077   mov         ecx,dword ptr [eax]       ; dereference the handle to
                                                 ; get the raw pointer
02061079   mov         dword ptr [ecx],100h      ; Next 4 lines are
0206107F   mov         dword ptr [ecx+4],200h    ; Singleton's inlined constructor
02061086   mov         dword ptr [ecx+8],400h
0206108D   mov         dword ptr [ecx+0Ch],0F84030h

As you can see, the assignment to singletons[i].reference is performed before the constructor for Singleton is called. This is completely legal under the existing Java memory model, and also legal in C and C++ (since neither of them have a memory model).
上面是國外網站給出的jit代碼和說明。


posted @ 2007-01-19 14:59 含笑半步癲 閱讀(1388) | 評論 (0)編輯 收藏
  2006年11月5日

我機器的內存是1.5g,平時一般只用500-700m.如果開機狀態(tài)下,人離開比較久(1-2小時),那個垃圾的策略無視將近1g的空閑內存,把東西寫到虛擬內存(硬盤)了.所以每次重新操作機器的時候,都要忍受那硬盤的咔噠聲.如果把虛擬內存禁了,就沒這現(xiàn)象了,但是我有的時候又會用超過1.5g的內存所以不得不開虛擬內存.

posted @ 2006-11-05 18:42 含笑半步癲 閱讀(1205) | 評論 (3)編輯 收藏
  2006年10月30日


一、內部函數(shù)
  1、內部合計函數(shù)
    1)COUNT(*)          返回行數(shù)
    2)COUNT(DISTINCT COLNAME)   返回指定列中唯一值的個數(shù)
    3)SUM(COLNAME/EXPRESSION)   返回指定列或表達式的數(shù)值和;
    4)SUM(DISTINCT COLNAME)    返回指定列中唯一值的和
    5)AVG(COLNAME/EXPRESSION)   返回指定列或表達式中的數(shù)值平均值
    6)AVG(DISTINCT COLNAME)    返回指定列中唯一值的平均值
    7)MIN(COLNAME/EXPRESSION)   返回指定列或表達式中的數(shù)值最小值
    8)MAX(COLNAME/EXPRESSION)   返回指定列或表達式中的數(shù)值最大值
  2、日期與時間函數(shù)
    1)DAY(DATE/DATETIME EXPRESSION)   返回指定表達式中的當月幾號
    2)MONTH(DATE/DATETIME EXPRESSION)  返回指定表達式中的月份
    3)YEAR(DATE/DATETIME EXPRESSION)   返回指定表達式中的年份
    4)WEEKDAY(DATE/DATETIME EXPRESSION) 返回指定表達式中的當周星期幾
    5)DATE(NOT DATE EXPRESSION)     返回指定表達式代表的日期值
    6)TODAY                返回當前日期的日期值
    7)CURRENT[first to last]        返回當前日期的日期時間值
    8)COLNAME/EXPRESSION UNITS PRECISION  返回指定精度的指定單位數(shù)
    9)MDY(MONTH,DAY,YEAR)       返回標識指定年、月、日的日期值
    10)DATETIME(DATE/DATETIME EXPRESSION)FIRST TO LAST 返回表達式代表的日期時間值
    11)INTERVAL(DATE/DATETIME EXPRESSION)FIRST TO LAST 返回表達式代表的時間間隔值
    12)EXTEND(DATE/DATETIME EXPRESSION,[first to last])返回經過調整的日期或日期時間

    例子1、和UNITS合用,指定日期或時間單位(year,month,day,hour,minute,seond,fraction):
       let tmp_date = today + 3 UNITS day
    例子2、let tmp_date = MDY(10,30,2002)  -- 2002-10-30
    例子3、let tmp_date = today + interval(7) day to day --當前時間加上7天;
       注:該功能與1相似;
    例子4、EXTEND轉換日期或日期時間值
       let tmp_inthour = extend(datetime1,hour to hour)

  3、代數(shù)函數(shù)
   1)ABS(COLNAME/EXPRESSION):       取絕對值
   2)MOD(COLNAME/EXPRESSION,DIVISOR)  返回除以除數(shù)后的模(余數(shù))
   3)POW(COLNAME/EXPRESSION,EXPONENT)  返回一個值的指數(shù)冥
     例子:let tmp_float = pow(2,3) --8.00000000

   4)ROOT(COLNAME/EXPRESSION,[index])  返回指定列或表達式的根值

   5)SQRT(COLNAME/EXPRESSION)      返回指定列或表達式的平方根值

   6)ROUND(COLNAME/EXPRESSION,[factor]) 返回指定列或表達式的圓整化值
   7)TRUNC(COLNAME/EXPRESSION,[factor]) 返回指定列或表達式的截尾值
     說明:上兩者中FACTOR指定小數(shù)位數(shù),若不指定,則為0;若為負數(shù),則整化到小數(shù)點左邊;
     注:ROUND是在指定位上進行4舍5入;TRUNC是在指定位上直接截斷;
     let tmp_float = round(4.555,2) --4.56
     let tmp_float = trunc(4.555,2) --4.55

  4、指數(shù)與對數(shù)函數(shù)
   1)EXP(COLNAME/EXPRESSION)    返回指定列或表達式的指數(shù)值
   2)LOGN(COLNAME/EXPRESSION)    返回指定列或表達式的自然對數(shù)值
   3)LOG10(COLNAME/EXPRESSION)   返回指定列或表達式的底數(shù)位10的對數(shù)值

  5、三角函數(shù)
   1)COS(RADIAN EXPRESSION)     返回指定弧度表達式的余弦值
   2)SIN(RADIAN EXPRESSION)     正弦
   3)TAN(RADIAN EXPRESSION)     正切
   4)ACOS(RADIAN EXPRESSION)     反余弦
   5)ASIN(RADIAN EXPRESSION)     反正弦
   6)ATAN(RADIAN EXPRESSION)     反正切
   7)ATAN2(X,Y)           返回坐標(X,Y)的極坐標角度組件

  6、統(tǒng)計函數(shù)
   1)RANGE(COLNAME)    返回指定列的最大值與最小值之差 = MAX(COLNAME)-MIN

(COLNAME)
   2)VARIANCE(COLNAME)  返回指定列的樣本方差;
   3)STDEV(COLNAME)    返回指定列的標準偏差;

  7、其他函數(shù)
   1)USER              返回當前用戶名
   2)HEX(COLNAME/EXPRESSION)    返回指定列或表達式的十六進制值
   3)LENGTH(COLNAME/EXPRESSION)  返回指定字符列或表達式的長度
   4)TRIM(COLNAME/EXPRESSION)   刪除指定列或表達式前后的字符
   5)COLNAME/EXPRESSION || COLNAME/EXPRESSION 返回并在一起的字符;

二、IDS內部函數(shù)
  1、DBSERVERNAME   返回數(shù)據(jù)庫服務器名 let tmp_char=DBSERVERNAME
  2、SITENAME     返回數(shù)據(jù)庫服務器名 let tmp_char=SITENAME
   說明:兩者功能相同;

  3、DBINFO(‘SPECIAL_KEYWORD')   返回只關鍵字值
   例子1:返回數(shù)據(jù)中每個表的DBSPACE名稱
     select dbinfo('dbspace',partnum),tabname from systables
     where tabid>99 and tabtype='T' (OK)
   例子2:返回任何表中插入的最后一個SERIAL值
     select dbinfo('sqlca.sqlerrd1') from systables where tabid = 1
   例子3:返回最后一個SELECT,INSERT,UPDATE,DELETE或EXECUTE PROCEDURE語句處理的行數(shù);
     select dbinfo('sqlca.sqlerrd2') from systables where tabid=1;



?

Date Manipulation

One of the more difficult concepts in Informix's handling of date and time values concerns the use of the variables in arithmetic or relational expressions. You can add or subtract DATE and DATETIME variables from each other. You can add or subtract an INTERVAL to a DATE or DATETIME. Table 1 shows the results of different types of operations on DATE and DATETIME values.

Table 1. Operations on DATE and DATETIME Variables

First Operand

Operation

Second Operand

Result

DATE

-

DATETIME

INTERVAL

DATETIME

-

DATE

INTERVAL

DATE

+-

INTERVAL

DATETIME

DATETIME

-

DATETIME

INTERVAL

DATETIME

+-

INTERVAL

DATETIME

INTERVAL

+

DATETIME

DATETIME

INTERVAL

+-

INTERVAL

INTERVAL

DATETIME

-

CURRENT

INTERVAL

CURRENT

-

DATETIME

INTERVAL

INTERVAL

+

CURRENT

DATETIME

CURRENT

+-

INTERVAL

DATETIME

DATETIME

+-

UNITS

DATETIME

INTERVAL

+-

UNITS

INTERVAL

INTERVAL

*/

NUMBER

INTERVAL

Notice that it's always okay to subtract one DATE or DATETIME value from another, as shown here:

CURRENT - "07/01/1950" = INTERVAL (my age)
"12/25/2000" – CURRENT = INTERVAL (how long till Xmas?)

In such a case, the result is always an INTERVAL variable. It would make no sense to add two DATE or DATETIME values together. What could such an addition represent?

UNITS Keyword

When working with INTERVAL values, sometimes it is necessary to specify the precision with which you are dealing. For example, suppose you have the following field defined:

lead_time INTERVAL DAY to DAY

To add 10 days to the lead time you could use a SQL statement like this:

SELECT lead_time + INTERVAL(10) DAY to DAY
FROM orders

You could achieve the same results using the UNITS keyword:

SELECT lead_time + 10 UNITS DAY 
FROM orders

Like most other programming languages, SQL often allows you to achieve the same ends with different statements. Sometimes the choice is one of personal style. Other times, one format fits in better with a structured style of code writing than another format does.

Functions

There are several built-in functions that affect date and time calculations. They can apply to either DATE or DATETIME values, with some exceptions.

TODAY

The TODAY function returns a DATE data value representing the current date. For example, you could execute a SQL function like this:

UPDATE member SET change_date = TODAY
WHER member_number = 12345

CURRENT

The CURRENT function is similar to the TODAY function, except it returns a DATETIME value. Without specific qualifiers, the default is YEAR to FRACTION(3). You can change the precision by using the same YEAR to FRACTION qualifiers as you use for DATETIMES. Thus, this would be legal:

SELECT * from member
WHERE elapsed_time < CURRENT YEAR to DAY

DATE

The DATE function takes as input a non-DATE value such as CHAR, DATETIME, or INTEGER and returns the corresponding DATE value. For example, the following SQL translates a CHARACTER value to a DATE:

SELECT * from member
WHERE enrollment_date > DATE('01/01/99')

DAY

This function returns an integer representing the day of the month. Here's an example:

SELECT * from member
WHERE DAY(enrollment_date) > DAY(CURRENT)

MONTH

This performs like the DAY function except it returns an integer between 1 and 12 representing the month:

SELECT * from member
WHERE enrollment_date > MONTH('01/01/99')

WEEKDAY

This returns an integer representing the day of the week, with 0 being Sunday and 6 being Saturday:

SELECT * from member
WHERE WEEKDAY(enrollment_date) > WEEKDAY(CURRENT)

YEAR

This function is like the ones above, only it returns a four-digit integer representing the year.

EXTEND

This function allows you to use different precisions in a DATETIME than you have specified in the declaration of the variable. It uses the same FIRST to LAST syntax as the DATETIME variables. This function is used to adjust the precision of a DATETIME variable to match the precision of an INTERVAL that you are using in a calculation. If the INTERVAL value has fields that are not part of the DATETIME value that you are using in a calculation, use the EXTEND function to adjust the precision of the DATETIME. EXTEND can either increase or decrease the precision of a DATETIME, depending upon the FIRST and LAST values.

Suppose myvariable is declared as DATETIME YEAR to DAY. If you want to add or subtract an INTERVAL defined as MINUTE, you first have to extend the DATETIME as follows:

SELECT EXTEND(myvariable, YEAR to MINUTE) – 
INTERVAL(5) MINUTE to MINUTE
FROM member

The resulting value will be DATETIME YEAR to MINUTE.

MDY

The MDY function converts three-integer values into a DATE format. The first integer is the month and must evaluate to an integer in the range 1–12. The second integer is the day and must evaluate to a number in the range from 1 to however many days are in the particular month (28–31). The third expression is the year and must be a four-digit integer. Thus, the following MDY functions would each be valid:

MDY(7,1,1950)

returns a DATE of "07/01/50"

MDY(MONTH(TODAY), 1, YEAR(TODAY))

returns a DATE equal to the first day of the current month in the current year

Informix has extensive capabilities for manipulating dates and times, which can make for long and complex SQL statements. Using the three time-related data types and the time-related functions and keywords, you can accomplish almost any type of manipulation of time data. Unfortunately, getting there may be cryptic and painful. If you regularly do extensive date and time manipulation, you should understand all of the intricacies of these data structures.

Have fun!?


?

posted @ 2006-10-30 14:44 含笑半步癲 閱讀(3898) | 評論 (0)編輯 收藏
  2006年8月28日
最近不知道中了什么流氓軟件,非常狡猾,怎么都殺不掉,下面是它彈出來的流氓網站記錄.

http://www.duduw.com/
嘟嘟網
http://59.34.197.176/go6456.asp
posted @ 2006-08-28 18:31 含笑半步癲 閱讀(820) | 評論 (1)編輯 收藏
  2006年7月25日
“Burn to CD or use daemon tools. Install MathCAD,
? ?? ? When asked for serial, click Next->Yes.
? ?? ? After installation, when the license is required, please set the
? ?? ? file "mcad13.dat" as the license.”

"mcad13.dat"文件路徑:? ???原始安裝文件目錄 \\Mathcad\program files\Mathsoft\Mathcad 13\mcad13.dat
posted @ 2006-07-25 00:04 含笑半步癲 閱讀(2141) | 評論 (3)編輯 收藏
僅列出標題  下一頁
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            噜噜噜久久亚洲精品国产品小说| 久久亚洲综合色一区二区三区| 欧美高清在线精品一区| 久久久精品久久久久| 国产午夜精品麻豆| 久久久无码精品亚洲日韩按摩| 欧美在线播放视频| 亚洲电影中文字幕| 亚洲精品乱码久久久久| 欧美日韩中文| 欧美中文字幕在线视频| 久久久久久9| 99热精品在线| 亚洲欧美一区二区三区在线| 国产性色一区二区| 欧美黄色免费| 国产精品久久久久久久9999| 久久久久久亚洲精品不卡4k岛国| 久久久久久精| 国产精品99久久久久久久久| 香蕉成人伊视频在线观看| 亚洲国产精品一区| 亚洲午夜激情网站| 亚洲电影免费观看高清完整版在线 | 亚洲精品老司机| 国产精品一区一区三区| 免费成人av| 国产精品yjizz| 美玉足脚交一区二区三区图片| 欧美精品激情在线| 久久乐国产精品| 欧美日韩精品一区| 美女视频黄 久久| 国产精品成人国产乱一区| 欧美**人妖| 国产日韩欧美在线一区| 亚洲精品孕妇| 亚洲成人在线视频网站| 午夜精品久久久久久| 在线午夜精品| 欧美96在线丨欧| 久久国产精品99精品国产| 欧美久久一区| 欧美激情亚洲自拍| 精品成人国产| 亚洲欧美日韩国产中文在线| 一区二区三区蜜桃网| 久久免费视频在线观看| 久久久高清一区二区三区| 国产精品极品美女粉嫩高清在线| 亚洲福利专区| 亚洲精品国精品久久99热一| 久久亚洲电影| 国产偷国产偷亚洲高清97cao| 亚洲国产裸拍裸体视频在线观看乱了| 国产精品色婷婷| 亚洲人成在线播放| 亚洲欧洲一级| 蜜臀久久99精品久久久久久9| 久久久久www| 国内精品久久久久影院 日本资源| 亚洲永久精品国产| 午夜综合激情| 国产日韩欧美精品综合| 欧美在线视频免费观看| 久久精品一区二区三区四区| 国产欧美日韩免费| 欧美在线观看网址综合| 久久另类ts人妖一区二区| 国产一区二区三区在线观看视频 | 亚洲欧美精品在线| 国产精品v一区二区三区| 亚洲桃花岛网站| 性欧美1819性猛交| 国产午夜精品理论片a级大结局 | 欧美伊人影院| 久久久夜精品| 在线日韩欧美| 欧美成人dvd在线视频| 亚洲国产精品久久久久| 一区二区三区|亚洲午夜| 欧美亚日韩国产aⅴ精品中极品| 一区二区三区 在线观看视频| 亚洲免费人成在线视频观看| 国产伦精品一区二区三区高清版 | 一区二区日本视频| 欧美在线综合| 亚洲精品欧美精品| 国产精品高清在线| 久久精品国语| 亚洲麻豆视频| 欧美在线观看视频在线| 在线观看亚洲精品| 欧美日韩视频不卡| 欧美一区免费视频| 91久久黄色| 久久精品国产清高在天天线| 亚洲黄色片网站| 国产精品高潮在线| 久久中文久久字幕| 亚洲制服欧美中文字幕中文字幕| 狼人天天伊人久久| 亚洲宅男天堂在线观看无病毒| 国产自产女人91一区在线观看| 欧美国产在线观看| 久久av二区| 一区二区三区高清| 欧美电影免费观看大全| 午夜视频一区| 99视频热这里只有精品免费| 国内精品美女在线观看| 欧美日韩中文字幕综合视频| 久久男人资源视频| 亚洲欧美久久久| 亚洲精品在线视频观看| 美女精品国产| 欧美中文字幕第一页| 亚洲国产高清自拍| 亚洲免费观看高清在线观看 | 亚洲免费av片| 在线观看福利一区| 国产精品日韩精品欧美精品| 欧美金8天国| 玖玖玖国产精品| 欧美制服丝袜| 亚洲自拍三区| 亚洲无线一线二线三线区别av| 亚洲激情视频网站| 欧美国产一区视频在线观看 | 亚洲综合色视频| 在线一区免费观看| 99综合视频| 99精品国产热久久91蜜凸| 亚洲欧洲精品成人久久奇米网| 在线观看亚洲视频| 黄色亚洲精品| 黄色成人av| 在线不卡a资源高清| 亚洲第一区色| 亚洲国产经典视频| 亚洲国产精品久久久久秋霞影院 | 欧美午夜精品久久久久免费视 | 欧美一级视频精品观看| 午夜精品久久久久久99热软件| 亚洲在线免费| 欧美一区二区三区成人| 欧美在线一二三| 久久久一区二区三区| 久久久久久高潮国产精品视| 久久国产主播精品| 免费成人av在线| 免费国产一区二区| 女人色偷偷aa久久天堂| 欧美精品在线免费观看| 欧美日韩系列| 国产精品免费福利| 国产视频一区三区| 亚洲第一综合天堂另类专| 亚洲激情网站| 亚洲免费视频观看| 玖玖精品视频| 91久久国产自产拍夜夜嗨| 一区二区三区精品| 欧美在线观看一区二区三区| 久久久久网址| 欧美日韩国产一级片| 国产精品日韩欧美一区二区| 国内精品久久久久影院 日本资源| 亚洲黄色在线看| 亚洲免费视频在线观看| 久久精品国语| 亚洲精品美女在线| 亚洲欧美制服另类日韩| 久久综合伊人| 国产精品久久久久久久久免费樱桃| 国产视频久久网| 日韩午夜中文字幕| 欧美一区二区三区四区在线观看地址| 麻豆精品在线播放| 一区二区三区av| 久久综合伊人77777| 国产精品青草综合久久久久99 | 欧美电影美腿模特1979在线看| 欧美小视频在线| 激情综合色丁香一区二区| 一本色道久久综合亚洲精品不 | 一区二区三区不卡视频在线观看| 亚洲视频一二| 麻豆av一区二区三区久久| 亚洲精品在线观| 久久视频这里只有精品| 欧美视频1区| 亚洲精品精选| 榴莲视频成人在线观看| 中文无字幕一区二区三区| 欧美成人精品h版在线观看| 狠狠色丁香久久综合频道| 亚洲一级片在线观看| 亚洲国产精品999| 久久这里有精品视频|