2013年5月29日 #
Lucene 的 Directory類就像它的意思一樣“目錄”,如“目錄”不存在,第一次啟動被創建,一旦文件被創建,它只能打開閱讀,或刪除。允許讀取和寫入隨機訪問。Java I/O api 不能直接使用,只能通過這個API 。Directory的實現類可以分為文件目錄,內存目錄和目錄的代理類及工具類。具體如下圖所示:
一:文件目錄
SimpleFSDirectory:FSDirectory的簡單實現,并發能力有限,遇到多線程讀同一個文件時會遇到瓶頸,通常用NIOFSDirectory或MMapDirectory代替。
NIOFSDirectory:通過java.nio's FileChannel實行定位讀取,支持多線程讀(默認情況下是線程安全的)。該類僅使用FileChannel進行讀操作,寫操作則是通過FSIndexOutput實現。
注意:NIOFSDirectory 不適用于Windows系統,另外如果一個訪問該類的線程,在IO阻塞時被interrupt或cancel,將會導致底層的文件描述符被關閉,后續的線程再次訪問NIOFSDirectory時將會出現ClosedChannelException異常,此種情況應用SimpleFSDirectory代替。
MMapDirectory:通過內存映射進行讀,通過FSIndexOutput進行寫的FSDirectory實現類。使用該類時要保證用足夠的虛擬地址空間。另外當通過IndexInput的close方法進行關閉時并不會立即關閉底層的文件句柄,只有GC進行資源回收時才會關閉。
為了能適應各個操作系統選擇最佳Directory方案,lucene 提供FSDirectory類的靜態方法open()實現自適應。
public static FSDirectory open(File path, LockFactory lockFactory) throws IOException {
if ((Constants.WINDOWS || Constants.SUN_OS || Constants.LINUX)
&& Constants.JRE_IS_64BIT && MMapDirectory.UNMAP_SUPPORTED) {
return new MMapDirectory(path, lockFactory);
} else if (Constants.WINDOWS) {
return new SimpleFSDirectory(path, lockFactory);
} else {
return new NIOFSDirectory(path, lockFactory);
}
}
二:內存目錄
RAMDirectory:常駐內存的Directory實現方式。默認通過SingleInstanceLockFactory(單實例鎖工廠)進行鎖的實現。該類不適合大量索引的情況。另外也不適用于多線程的情況。 在索引數據量大的情況下建議使用MMapDirectory代替。RAMDirectory是Directory抽象類在使用內存最為文件存儲的實現類,其主要是將所有的索引文件保存到內存中。這樣可以提高效率。但是如果索引文件過大的話,則會導致內存不足,因此,小型的系統推薦使用,如果大型的,索引文件達到G級別上,推薦使用FSDirectory。
NRTCachingDirectory:是對RAMDirectory的封裝,適用于近乎時時(near-real-time)操作的環境。
三:Direcotry的代理類及工具類
FileSwitchDirectory:文件切換的Directory實現.針對lucene的不同的索引文件使用不同的Directory .借助FileSwitchDirectory整合不同的Directory實現類的優點于一身
比如MMapDirectory,借助內存映射文件方式提高性能,但又要減少內存切換的可能 ,當索引太大的時候,內存映射也需要不斷地切換,這樣優點也可能變缺點,而之前的NIOFSDirectory實現java NIO的方式提高高并發性能,但又因高并發也會導致IO過多的影響,所以這次可以借助FileSwitchDirectory發揮他們兩的優點。
RateLimitedDirectoryWrapper:通過IOContext來限制讀寫速率的Directory封裝類。
CompoundFileDirectory:用于訪問一個組合的數據流。僅適用于讀操作。對于同一段內擴展名不同但文件名相同的所有文件合并到一個統一的.cfs文件和一個對應的.cfe文件內。
.cfs文件由Header,FileData和FileCount組成。.cfe文件由Header,FileCount,FileName,DataOffset,DataLength組成。.cfs文件中存儲著索引的概要信息及組合文件
的數目(FileCount)。.cfe文件存儲文件目錄的條目內容,內容中包括文件數據扇區的起始位置,文件的長度及文件的名稱。
TrackingDirectoryWrapper:Directory的代理類。用于記錄哪些文件被寫入和刪除。
四:Direcotry讀寫對象的類圖
文章轉載過來的!
本機已經安裝了jdk1.6,而比較早期的項目需要依賴jdk1.5,于是同時在本機安裝了jdk1.5和jdk1.6.
安裝jdk1.5前,執行java -version得到
java version "1.6.0_38"
Java(TM) SE Runtime Environment (build 1.6.0_38-b05)
Java HotSpot(TM) 64-Bit Server VM (build 20.13-b02, mixed mode)
安裝完jdk1.5,并修改環境變量JAVA_HOME為D:\devSoftware\jdk1.5.再執行 java -version時,依然顯示:
java version "1.6.0_38"
Java(TM) SE Runtime Environment (build 1.6.0_38-b05)
Java HotSpot(TM) 64-Bit Server VM (build 20.13-b02, mixed mode)
看上去,新的環境變量JAVA_HOME=D:\devSoftware\jdk1.5并沒有生效。 在網上找了很多資料才發現:
在安裝JDK1.6時(本機先安裝jdk1.6再安裝的jdk1.5),自動將java.exe、javaw.exe、javaws.exe三個可執行文件復制到了C:\Windows\System32目錄,由于這個目錄在WINDOWS環境變量中的優先級高于JAVA_HOME設置的環境變量優先級
解決方案:將java.exe,javaw.exe,javaws.exe刪除即可。開啟新的命令行窗口,再執行java -version時,就得到了期望中的結果
java version "1.5.0_17"
Java(TM) 2 Runtime Environment, Standard Edition (build 1.5.0_17-b04)
Java HotSpot(TM) 64-Bit Server VM (build 1.5.0_17-b04, mixed mode)
在學lucene 之初看了許多書,都是走馬觀花,沒有項目的驅動下,來一個用例demo感覺也不是很難,“我會了”這是我的第一感覺。
在2013年底公司接到一個項目用到lucene,這是我第一次正真接觸Lucene,代碼比較老3.6版本,不適合新項目的需求(空間查詢)。于是下載了最新版本 4.51,有帶“空間查詢”模塊。各大搜索引擎都沒有找到像樣例子,于是想到了lucene svn的 trunk目錄測試用例中找到了測試例子,開始了一段lucene之旅。
寫數據,創建IndexWriter,通過它的構造函數需要一個索引目錄(Diectory)和索引寫入配置項(InderWriterConfig),直接上代碼:
//設置寫入目錄(好幾種呵呵)
Directory d=FSDirectory.open(new File("D:/luceneTest"));
//設置分詞 StandardAnalyzer(會把句子中的字單個分詞)
Analyzer analyzer= new StandardAnalyzer(Version.LUCENE_45);
//設置索引寫入配置
IndexWriterConfig config=new IndexWriterConfig(Version.LUCENE_45,analyzer);
//設置創建模式
//config.setOpenMode(IndexWriterConfig.OpenMode.CREATE_OR_APPEND);
IndexWriter indexwriter= new IndexWriter(d,config);
上面四行代碼就創建好了indexwriter,下面把數據填入就好了,寫入有多種方式如下圖:
用 addDocment 舉例代碼如下:
Document doc=new Document();
doc.add(new StringField("id", "1", Store.YES));
doc.add(new StringField("name", "brockhong", Store.YES));
doc.add(new TextField("content", "lucene 文檔第一次寫看著給分吧", Store.YES));
//寫入數據
indexwriter.addDocument(doc);
//提交
indexwriter.commit();
用 Luke 工具查看Text列,這是標準分詞惹的禍哦!寫入成功。
讀數據查詢,創建 IndexSearcher 構造函數設置indexReader ,輸入查詢條件,上面content字段數據設置了分詞,所以必須通過查詢解析類QueryParser設定分詞字段、版本、分詞模式,并通過parse方法得到查詢條件。代碼如下:
//讀數據
//創建 indexReader 這個已過時 IndexReader.open(d),里面的代碼一樣可能為了兼容老版本
IndexReader indexReader = DirectoryReader.open(d);
IndexSearcher indexSearcher = new IndexSearcher(indexReader);
//查詢 設置分詞字段
QueryParser queryParser = new QueryParser(Version.LUCENE_45, "content",
new StandardAnalyzer(Version.LUCENE_45));
//or 關系 “給”、“分”
queryParser.setDefaultOperator(QueryParser.OR_OPERATOR);
Query query = queryParser.parse("給分");
TopDocs results = indexSearcher.search(query, 100);
int numTotalHits = results.totalHits;
System.out.println("共 " + numTotalHits + " 完全匹配的文檔");
ScoreDoc[] hits = results.scoreDocs;
for (int i = 0; i < hits.length; i++) {
Document document = indexSearcher.doc(hits[i].doc);
System.out.println("content:" + document.get("content"));
}
使用SAXReader的read(File file)方法時,如果xml文件異常會導致文件被服務器占用不能移動文件,建議不使用read(File file)方法而使用read(FileInputStream fis)等流的方式讀取文件,異常時關閉流,這樣就不會造成流未關閉,文件被鎖的現象了。(在服務器中運行時會鎖住文件,main方法卻不會)。
1、以下方式xml文件異常時會導致文件被鎖
- Document document = null;
- File file = new File(xmlFilePath);
- SAXReader saxReader = new SAXReader();
- try
- {
- document = saxReader.read(file);
- } catch (DocumentException e)
- {
- logger.error("將文件[" + xmlFilePath + "]轉換成Document異常", e);
- }
2、以下方式xml文件異常時不會鎖文件(也可以使用其他的流來讀文件)
- Document document = null;
- FileInputStream fis = null;
- try
- {
- fis = new FileInputStream(xmlFilePath);
- SAXReader reader = new SAXReader();
- document = reader.read(fis);
- }
- catch (Exception e)
- {
- logger.error("將文件[" + xmlFilePath + "]轉換成Document異常", e);
- }
- finally
- {
- if(fis != null)
- {
- try
- {
- fis.close();
- } catch (IOException e)
- {
- logger.error("將文件[" + xmlFilePath + "]轉換成Document,輸入流關閉異常", e);
- }
- }
- }
arcgis
CGCS2000_3_Degree_GK_Zone_40
WKID: 4528 Authority: EPSG
Projection: Gauss_Kruger
False_Easting: 40500000.0
False_Northing: 0.0
Central_Meridian: 120.0
Scale_Factor: 1.0
Latitude_Of_Origin: 0.0
Linear Unit: Meter (1.0)
Geographic Coordinate System: GCS_China_Geodetic_Coordinate_System_2000
Angular Unit: Degree (0.0174532925199433)
Prime Meridian: Greenwich (0.0)
Datum: D_China_2000
Spheroid: CGCS2000
Semimajor Axis: 6378137.0
Semiminor Axis: 6356752.314140356
Inverse Flattening: 298.257222101
Java 自定義
經緯度轉換
///+proj=tmerc +lat_0=0 +lon_0=120 +k=1 +x_0=40500000 +y_0=0 +ellps=GRS80 +units=m +no_defs
Point2D.Double srcProjec = null;
Point2D.Double dstProjec = null;
Projection proj = ProjectionFactory.fromPROJ4Specification (proj4_w);
// "epsg:4528" 數據從proj4 拷貝 nad
// Point2D.Double srcProjec = null;
// Point2D.Double dstProjec = null;
// Projection proj = ProjectionFactory.getNamedPROJ4CoordinateSystem ("epsg:4528");
srcProjec = new Point2D.Double (120.159,30.267);
//40515348.2903 3349745.5395
dstProjec = proj.transform (srcProjec, new Point2D.Double ());
System.out.println ("TM:" + dstProjec);
// TM: Point2D.Double [644904.399587292, 400717.8948938238]
srcProjec = new Point2D.Double (40515348.2903 ,3349745.5395);
dstProjec = proj.inverseTransform (srcProjec, new Point2D.Double ());
System.out.println ("TM:" + dstProjec);
今天研究Oracle遇到了這個問題ora-01033:oracle initializationor shutdown in progress
ORA-01033:ORACLEinitialization or shutdown in progress
解決方法
1)開始-運行-cmd
2)命令行中輸入SQLPLUS SYS/SYS AS SYSDBA
3)輸入SHUTDOWN
4)輸入STARTUP.注意這里是最重要的地方,在顯示相關數據后,它還會顯示為什么不能啟動的錯誤所在.
C:\Users\lenovo>SQLPLUSSYS/SYS AS SYSDBA
SQL*Plus: Release 10.2.0.3.0 - Production on星期三 7月 3 11:43:32 2013
Copyright (c) 1982, 2006, Oracle. All Rights Reserved.
連接到:
Oracle Database 10g Enterprise Edition Release 10.2.0.3.0 -Production
With the Partitioning, OLAPand Data Mining options
SQL> SHUTDOWN
ORA-01109:數據庫未打開
已經卸載數據庫。
ORACLE例程已經關閉。
SQL> STARTUP
ORACLE例程已經啟動。
Total System Global Area 293601280 bytes
Fixed Size 1290208 bytes
Variable Size 234881056 bytes
Database Buffers 50331648 bytes
Redo Buffers 7098368 bytes
數據庫裝載完畢。
ORA-01157:無法標識/鎖定數據文件 6 - 請參閱 DBWR 跟蹤文件
ORA-01110:數據文件 6: 'F:\DC\DB\SDRS\TS_SDRS.DBF'
SQL> alter databasedatafile'F:\DC\DB\SDRS\TS_SDRS.DBF'offline drop;
數據庫已更改。
SQL> alter database open;
數據庫已更改。
SQL> drop tablespaceTS_SDRS including contents;
表空間已刪除。
SQL> create undo tablespace TS_SDRS
2 datafile'CracleoradatasmsdbUNDOTBS01.DBF'size 2048M extent management local;
表空間已創建。
SQL> alter system setundo_tablespace=TS_SDRS;
系統已更改。
SQL> shutdown
數據庫已經關閉。
已經卸載數據庫。
ORACLE例程已經關閉。
SQL> startup
ORACLE例程已經啟動。
Total System Global Area 293601280 bytes
Fixed Size 1290208 bytes
Variable Size 243269664 bytes
Database Buffers 41943040 bytes
Redo Buffers 7098368 bytes
數據庫裝載完畢。
數據庫已經打開。
SQL>
------------------
ORA-01245、ORA-01547錯誤的解決
數據庫rman restore database 之后,執行recover database的時候,報告ORA-01245錯誤,詳細的錯誤信息如下:
SQL> recover database until cancel; ORA-00279: change 575876 generated at 12/01/2009 08:19:49 needed for thread 1 ORA-00289: suggestion : /oracle/flash_recovery_area/ORCL/archivelog/2009_12_01/o1_mf_1_2_%u_.arc ORA-00280: change 575876 for thread 1 is in sequence #2 Specify log: { auto ORA-00308: cannot open archived log '/oracle/flash_recovery_area/ORCL/archivelog/2009_12_01/o1_mf_1_2_%u_.arc' ORA-27037: unable to obtain file status Linux Error: 2: No such file or directory Additional information: 3 ORA-00308: cannot open archived log '/oracle/flash_recovery_area/ORCL/archivelog/2009_12_01/o1_mf_1_2_%u_.arc' ORA-27037: unable to obtain file status Linux Error: 2: No such file or directory Additional information: 3 ORA-01547: warning: RECOVER succeeded but OPEN RESETLOGS would get error below ORA-01245: offline file 2 will be lost if RESETLOGS is done ORA-01110: data file 2: '/oracle/oradata/orcl/undotbs01.dbf' SQL> |
[@more@]
檢查ORA-01245那一行,發現是datafile 2狀態為offline,解決的方法就是首先將datafile 2 online,然后再recover database。
SQL> alter database datafile 2 online; Database altered. SQL> recover database until cancel; ORA-00279: change 575876 generated at 12/01/2009 08:19:49 needed for thread 1 ORA-00289: suggestion : /oracle/flash_recovery_area/ORCL/archivelog/2009_12_01/o1_mf_1_2_%u_.arc ORA-00280: change 575876 for thread 1 is in sequence #2 Specify log: { cancel Media recovery cancelled. SQL> alter database open resetlogs; Database altered. SQL> |
--------------------
ORA-01589: 要打開數據庫則必須使用 RESETLOGS 或 NOR
ORA-01589: 要打開數據庫則必須使用 RESETLOGS 或 NORESETLOGS
選項
SQL> alter database open
ORA-01589: 要打開數據庫則必須使用 RESETLOGS 或
NORESETLOGS 選項
SQL> alter database open resetlogs;
alter database
open resetlogs
*
ERROR 位于第 1 行:
ORA-01113: 文件 1 需要介質恢復
ORA-01110:
數據文件 1: 'E:\ORACLE\ORADATA\EYGLE\SYSTEM01.DBF'
SQL> recover database
using backup controlfile;
ORA-00279: 更改 1670743 (在 04/17/2008 14:13:16 生成)
對于線程 1 是必需的
ORA-00289: 建議: E:\ORACLE\ORA92\RDBMS\ARC00030.001
ORA-00280:
更改 1670743 對于線程 1 是按序列 # 30 進行的
指定日志: {<RET>=suggested | filename |
AUTO | CANCEL}
E:\oracle\oradata\EYGLE\REDO01.LOG
ORA-00310: 存檔日志包含序列
29;要求序列 30
ORA-00334: 歸檔日志:
'E:\ORACLE\ORADATA\EYGLE\REDO01.LOG'
SQL> recover database using
backup controlfile;
ORA-00279: 更改 1670743 (在 04/17/2008 14:13:16 生成) 對于線程 1
是必需的
ORA-00289: 建議: E:\ORACLE\ORA92\RDBMS\ARC00030.001
ORA-00280: 更改
1670743 對于線程 1 是按序列 # 30 進行的
指定日志: {<RET>=suggested | filename |
AUTO |
CANCEL}
E:\oracle\oradata\EYGLE\REDO02.LOG
已應用的日志。
完成介質恢復。
SQL>
alter database open resetlogs;
數據庫已更改。
OK,搞定了!
首先來看問題,然后來看函數的定義,其實什么都在函數定義里面說明白了
1.正則表達式字符串問題
首先輸入的regex是一個正則表達式,而不是一個普通的字符串,所以導致很多在正則表達式里面有特殊意義的比如 "." "|" "\" ,如果直接使用是不行的,另外一個方面我們輸入的regex是以字符串形式傳遞的,對有些字符必須要轉義,尤其是"\",下面請看例子
String[] aa = "aaa|bbb|ccc".split("|");//wrong
String[] aa = "aaa|bbb|ccc".split("\\|"); //
String[] aa = "aaa*bbb*ccc".split("*");//wrong
String[] aa = "aaa|bbb|ccc".split("\\*");
String[] aa = "aaa*bbb*ccc".split(".");//wrong
String[] aa = "aaa|bbb|ccc".split("\\.");
String[] aa = "aaa\\bbb\\bccc".split("\\");//wrong
String[] aa = "aaa\\bbb\\bccc".split("\\\\");
2.數組長度的問題
String a = "";
String[] b = a.split(",");
b.length為 1;
*
String a = "c";
String[] b = a.split(",");
b.length為 1;
**
String a = "c,,,";
String[] b = a.split(",");
b.length為 1;
***
String a = "c,,c";
String[] b = a.split(",");
b.length為 3;
****
String a = ",";
String[] b = a.split(",");
b.length為 0;
其實只要添加一個參數即可,例如
String str = "abcdef,ghijk,lmno,pqrst,,,";
String[] array = str.split(",");
輸出:abcdef,ghijk,lmno,pqrst,
String str = "abcdef,ghijk,lmno,pqrst,,,";
String[] array = str.split(",",-1);
輸出:abcdef,ghijk,lmno,pqrst,,,,
public String [] split (String regex, int limit)
最后一個參數limit是影響返回數組的長度的
=========================請關注紅色字體(括號內為注釋)==========================================
public String[] split(String regex)
- 根據給定的正則表達式的匹配來拆分此字符串。
該方法的作用就像是使用給定的表達式和限制參數 0 來調用兩參數
split
方法。因此,結果數組中不包括結尾空字符串(直接使用會造成數組大小問題)。例如,字符串 "boo:and:foo" 產生帶有下面這些表達式的結果:
Regex 結果 : { "boo", "and", "foo" } o { "b", "", ":and:f" } - 參數:
regex
- 定界正則表達式- 返回:
- 字符串數組,根據給定正則表達式的匹配來拆分此字符串,從而生成此數組。
public String[] split(String regex,
int limit)
- 根據匹配給定的正則表達式來拆分此字符串。
此方法返回的數組包含此字符串的每個子字符串,這些子字符串由另一個匹配給定的表達式的子字符串終止或由字符串結束來終止。數組中的子字符串按它們在此字符串中的順序排列。如果表達式不匹配輸入的任何部分,則結果數組只具有一個元素,即此字符串。
limit 參數控制模式應用的次數,因此影響結果數組的長度。如果該限制 n 大于 0,則模式將被最多應用 n - 1 次,數組的長度將不會大于 n,而且數組的最后項將包含超出最后匹配的定界符的所有輸入。如果 n 為非正,則模式將被應用盡可能多的次數,而且數組可以是任意長度。如果 n 為零,則模式將被應用盡可能多的次數,數組可有任何長度,并且結尾空字符串將被丟棄。
例如,字符串 "boo:and:foo" 使用這些參數可生成下列結果:
Regex Limit 結果 : 2 { "boo", "and:foo" } : 5 { "boo", "and", "foo" } : -2 { "boo", "and", "foo" } o 5 { "b", "", ":and:f", "", "" } o -2 { "b", "", ":and:f", "", "" } o 0 { "b", "", ":and:f" } 這種形式的方法調用 str.split(regex, n) 產生與以下表達式完全相同的結果:
Pattern
.compile
(regex).split
(str, n) - 參數:
regex
- 定界正則表達式limit
- 結果閾值,如上所述- 返回:
- 字符串數組,根據給定正則表達式的匹配來拆分此字符串,從而生成此數組
List<Calendar> l = new ArrayList<Calendar>();
while (true) {
l.add(Calendar.getInstance());
System.out.println(l.size());
}
605473
Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
at java.util.Calendar.<init>(Unknown Source)
at java.util.GregorianCalendar.<init>(Unknown Source)
at java.util.Calendar.createCalendar(Unknown Source)
at java.util.Calendar.getInstance(Unknown Source)
at jodatestmemory.Main.main(Main.java:25)
#ifndef CLASS_GEOMETRYTOSTRING
--------------------------------
java --HelloJNI ---
-----GeodbEntity ----
-環境的搭建,下載與安裝LIBXML2和ICONV
Libxml2是一個C語言的XML程序庫,可以簡單方便的提供對XML文檔的各種操作,并且支持XPATH查詢,以及部分的支持XSLT轉換等功能。Libxml2的下載地址是http://xmlsoft.org/downloads.html,完全版的庫是開源的,并且帶有例子程序和說明文檔。完全版的文件名為:libxml2-2.7.8.tar.gz。
Libxml2中默認的內碼是UTF-8,所有使用libxml2進行處理的xml文件,必須首先顯式或者默認的轉換為UTF-8編碼才能被處理。
要在xml中使用中文,就必須能夠在UTF-8和GB2312內碼(較常用的一種簡體中文編碼)之間進行轉換。Libxml2提供了默認的內碼轉換機制,并且在libxml2的Tutorial中有一個例子,事實證明這個例子并不適合用來轉換中文。所以需要我們顯式的使用ICONV來進行內碼轉換,libxml2本身也是ICONV使用進行轉換的。ICONV是一個專門用來進行編碼轉換的庫,基本上支持目前所有常用的編碼。它是glibc庫的一個部分,常常被用于UNIX系統中。當然,在windows下面使用也沒有任何問題。
其下載地址是http://gnuwin32.sourceforge.net/packages/libiconv.htm,文件名為libiconv-1.9.2-1-lib.zip。
將libiconv-1.9.2-1-lib.zip解壓,將其中的iconv.h放入C:\opt\include目錄中,將其中的libiconv.lib放入C:\opt\lib中,并改名為iconv.lib.(沒有opt目錄就新建一個)。
解壓libxml2-2.7.8.tar.gz文件到C盤根目錄,在c:\libxml2-2.7.8\libxml2-2.7.8\win32目錄中存放了多個Windows平臺編譯器的Makefile文件,我們使用vs2008,所以待會會用Makefile.msvc文件。
1.進入Visual Studio 2008 Command Prompt;
2.cd c:\libxml2-2.7.8\libxml2-2.7.8\win32
3.輸入cscript configure.js compiler=msvc prefix=c:\opt include=c:\opt\include lib=c:\opt\lib debug=yes,回車執行。
4.最后使用nmake命令進行編譯,輸入nmake /f Makefile.msvc并回車。
此時會出現一下錯誤提示,
Makefile.msvc(465) : fatal error U1020: end-of-file found before next directive
Stop.
網上找了下原因,原來是Makefile.msvc中存在錯誤。
將以上三行前面的+號都刪掉,重新執行nmake即可。
在當前win32目錄中生成了一個bin.msvc目錄,其中就有開發需要的libxml2.lib和libxml2.dll文件。
RBCXF-CVBGR-382MK-DFHJ4-C69G8
-------------------------------------------------------------------------------------------
GeohashPrefixTree grid = new GeohashPrefixTree(ctx, 12);//< 1 meter == 11 maxLevels
grid刪除最后一行數據后,store reload ,因為數據庫中已經沒有數據了,所以返回null .
但是ext不認這個東西,所以在service中進行判斷。如果數據為null ,則返回
"{total:0,gridData:[]}" ;
重新編譯,運行后,刪除最后一行數據,就會看不到了。
一.問題的提出
/usr/local/webserver/mysql/bin/mysql -u root -h 172.29.141.112 -p -S /tmp/mysql.sock
Enter password:
ERROR 2003 (HY000): Can't connect to MySQL server on '172.29.141.112' (113)
二.問題的分析
出現上述問題,可能有以下幾種可能
1. my.cnf 配置文件中 skip-networking 被配置
skip-networking 這個參數,導致所有TCP/IP端口沒有被監聽,也就是說出了本機,其他客戶端都無法用網絡連接到本mysql服務器
所以需要把這個參數注釋掉。
2.my.cnf配置文件中 bindaddress 的參數配置
bindaddress,有的是bind-address ,這個參數是指定哪些ip地址被配置,使得mysql服務器只回應哪些ip地址的請求,所以需要把這個參數注釋掉。
3.防火墻的原因
通過 /etc/init.d/iptables stop 關閉防火墻
我的問題,就是因為這個原因引起的。關閉mysql 服務器的防火墻就可以使用了。
三.問題的解決
1. 如果是上述第一個原因,那么 找到 my.cnf ,注釋掉 skip-networking 這個參數
sed -i 's%skip-networking%#skip-networking%g' my.cnf
2. 如果是上述第二個原因,那么 找到 my.cnf ,注釋掉 bind-address 這個參數
sed -i 's%bind-address%#bind-address%g' my.cnf
sed -i 's%bindaddress%#bindaddress%g' my.cnf
最好修改完查看一下,這個參數。
3.如果是上述第三個原因,那么 把防火墻關閉,或者進行相應配置
/etc/init.d/iptables stop
四.參考
http://hi.baidu.com/vbkan/blog/item/cd5035030cefee793812bb56.html
http://dev.firnow.com/course/7_databases/mysql/myxl/20090820/169010.html
上面方法不行,下面的可以
步驟1、配置/etc/sysconfig/network-scripts/ifcfg-eth0 里的文件。it動力的CentOS下的ifcfg-eth0的配置詳情:
[root@localhost ~]# vim /etc/sysconfig/network-scripts/ifcfg-eth0
DEVICE="eth0"
HWADDR="00:0C:29:FD:FF:2A"
NM_CONTROLLED="yes"
ONBOOT="yes"
IPADDR=192.168.1.31
NETMASK=255.255.255.0
GATEWAY=192.168.1.1
BOOTPROTO=static
前面三行是系統睚帶的,后面就是手動添加的。
這樣設置扣,記得重啟網卡:
[root@localhost ~]# /etc/init.d/network stop
[root@localhost ~]# /etc/init.d/network start
行了,現在就可以PING得通網關了,如果還得上網,不必須設置DNS。設置DNS就詳見步驟2
步驟2、修改dns
[root@localhost ~]# vi /etc/resolv.conf
在里面添加二個dns:
nameserver 202.96.134.133
nameserver 8.8.8.8
ok,大攻告成,即可上網了!!!!
The VMware vSphere Web Services SDK includes all the components necessary to work with the VMware vSphere API, including WSDL files, sample code, and libraries. The vSphere Web Services SDK facilitates development of client applications that target the VMware vSphere API. With the vSphere Web Services SDK, developers can create client applications to manage, monitor, and maintain VMware vSphere components, as deployed on VMware®VMware vSphere®ESX®, ESXi™, and VMware®vCenter™ Server systems.
這是官方對vSphere Web Services SDK的介紹,簡單來說就是提供了管理vcenter,ESXi的程序接口,目前支持JAVA和.NET平臺,下面以windows 7平臺為例,介紹JAVA開發環境的部署過程
一、開發環境準備
1、安裝JAVA開發環境 J2SE 1.6 b22
安裝到c:\java下,不要安裝到C:\program files下,目錄中有空格,執行腳本的時候會報錯
2、安裝SOAP工具JAX-WS2.1
http://jax-ws.java.net/2.1.1/index.html
雙擊安裝即可
3、下載vSphere Web Services SDK 5.1
http://communities.vmware.com/community/vmtn/developer/downloads
解壓到c:\devprojects下
二、開發環境配置
1、設置系統變量
JAVA_HOME=C:\java\jdk1.6.0_22
JAVAHOME=C:\java\jdk1.6.0_22
SDKHOME=C:\devprojects
VMKEYSTORE=C:\VMware-Certs\vmware.keystore(稍后介紹安裝過程)
WEBHOME=C:\devprojects\vsphere-ws\java\Axis\lib\wbem.jar
WS_SDK_HOME=C:\devprojects\SDK\vsphere-ws
CLASSPATH=.;%JAVA_HOME%\lib\dt.jar;%JAVA_HOME%\lib\tools.jar;C:\devprojects\SDK\vsphere-ws\java\JAXWS\lib\samples.jar;C:\devprojects\SDK\vsphere-ws\java\JAXWS\lib\vim25.jar(這個變量很重要)
2、服務器認證
2.1、將ESX Server或Vcenter的證書導入本機,ESXi的證書在/etc/vmware/ssl/rui.crt;Vcenter的證書在C:/Documents and Settings/All Users/Application Data/VMware/VMware VitualCenter/SSL/rui.crt
2.2、證書拷貝到本機的C:/VMware-Certs目錄下,打開windows7的命令行界面,切換到C:/VMware-Certs目錄下,使用jdk的keytool工具導入證書:
keytool -import -file <certificate-filename> -alias <server-name> -keystore vmware.keystore
其中certificate-filename為rui.crt,service-name可以為服務器的機器名或IP地址,運行成功后會在C:/VMware-Certs目錄下生成vmware.keystore文件。
3、重新編譯JAX-WS
如果你的安裝的版本不是JDK 1.6 b22或者SOAP不是用 JAX-WS2.1,就需要重新編譯
打開CMD,切換到C:\devprojects\SDK\vsphere-ws\java\JAXWS\
運行build.bat
運行成功會出現會出現
#cd mysql-5.0.56
#./configure --prefix=/usr/local/mysql --localstatedir=/usr/loal/mysql/data -- libexecdir=/usr/local/mysql/lib --disable-shared
#make
#make install
#cd /usr/local/mysql/
#groupadd -g 1003 mysql
#useradd -g 1003 mysql
#chown -R mysql .
#chgrp -R mysql .
#chown -R mysql lib
#./bin/mysql_install_db --user=mysql //以mysql的用戶身份安裝
#chown -R root .
#./bin/mysqld_safe --user=mysql & //在后臺啟動mysql
# cd /root/mysql-5.0.56
# cp support-files/my-medium.cnf /etc/my.cnf
# cp support-files/mysql.server /etc/rc.d/init.d/mysqld
# chmod 700 !$
# chkconfig --add mysqld
# chkconfig --list mysqld
mysqld 1:off 2:on 3:on 4:on 5:on 6:off
# service mysqld start[restart/reload/stop]
# vi /etc/my.cnf
add this:(防止mysql服務器無查詢后8小時自動重連)
wait_timeout = 86400
#/usr/local/mysql/bin/mysqladmin -uroot password 'aptech'
#./bin/mysql -uroot -paptech
#cd bind-9.5.0-P2
#./configure --prefix=/usr/local/bind9 --with-dlz-mysql=/usr/local/mysql --enable-threads=no
#make
#make install
3、創建database,table
key "rndc-key" {
algorithm hmac-md5;
secret "c4aUV+N7GbOF773V+/LnAA==";
};
controls {
inet 127.0.0.1 port 953
allow { 127.0.0.1; } keys { "rndc-key"; };
};
# End of named.conf
options {
directory "/usr/local/bind9/etc/";
pid-file "/usr/local/bind9/var/run/named.pid";
allow-query { any; };
recursion no;
version "gaint-d1";
};
include "/usr/local/bind9/etc/cnc.cl";
include "/usr/local/bind9/etc/other.cl";
view "cnc-user" {
match-clients { cnc; };
dlz "Mysql zone" {
database "mysql
{host=localhost dbname=mydata ssl=false port=3306 user=root pass=aptech}
{select zone from cnc_dns_records where zone = '%zone%'}
{select ttl, type, mx_priority, case when lower(type)='txt' then concat('/"', data,
'/"')
when lower(type) = 'soa' then concat_ws('
', data, resp_person, serial, refresh, retry, expire, minimum) else data end as mydata from
cnc_dns_records where zone = '%zone%' and host = '%record%'}";
};
};
view "other-user" {
match-clients { other; };
dlz "Mysql zone" {
database "mysql
{host=localhost dbname=mydata ssl=false port=3306 user=root pass=aptech}
{select zone from other_dns_records where zone='%zone%'}
{select ttl, type, mx_priority, case when lower(type) = 'txt' then concat('/"', data,
'/"')
when lower(type)='soa' then concat_ws('
', data, resp_person, serial, refresh, retry, expire, minimum) else data end as mydata from
other_dns_records where zone = '%zone%' and host = '%record%'}";
};
};
[root@dlz etc]# less cnc.cl
acl "cnc"{
192.168.9.0/24;
};
acl "other" {
127.0.0.0/18;
};
06-Mar-2009 22:23:02.569 starting BIND 9.5.0-P2 -gc /usr/local/bind9/etc/named.conf
06-Mar-2009 22:23:02.579 loading configuration from '/usr/local/bind9/etc/named.conf'
06-Mar-2009 22:23:02.583 listening on IPv4 interface lo, 127.0.0.1#53
06-Mar-2009 22:23:02.586 listening on IPv4 interface eth0, 192.168.1.5#53
06-Mar-2009 22:23:02.588 Loading 'Mysql zone' using driver mysql
06-Mar-2009 22:23:02.604 default max-cache-size (33554432) applies: view cnc-user
06-Mar-2009 22:23:02.609 Loading 'Mysql zone' using driver mysql
06-Mar-2009 22:23:02.612 default max-cache-size (33554432) applies: view other-user
06-Mar-2009 22:23:02.616 default max-cache-size (33554432) applies: view _bind
06-Mar-2009 22:23:02.621 command channel listening on 127.0.0.1#953
06-Mar-2009 22:23:02.621 ignoring config file logging statement due to -g option
06-Mar-2009 22:23:02.623 running
癥狀:系統運行了一段時間報錯:java.sql.SQLException: ORA-01000: 超出打開游標的最大數
step 1:
查看數據庫當前的游標數配置slqplus:show parameter open_cursors;
step 2:
查看游標使用情況:
select o.sid, osuser, machine, count(*) num_curs
from v$open_cursor o, v$session s
where user_name = 'user' and o.sid=s.sid
group by o.sid, osuser, machine
order by num_curs desc;
此處的user_name='user'中,user代表占用數據庫資源的數據庫用戶名.
step 3:
查看游標執行的sql情況:
select o.sid q.sql_text
from v$open_cursor o, v$sql q
where q.hash_value=o.hash_value and o.sid = 123;
step 4:
根據游標占用情況分析訪問數據庫的程序在資源釋放上是否正常,如果程序釋放資源沒有問題,則加大游標數。
alter system set open_cursors=2000 scope=both;
補充:在java代碼中,執行conn.createStatement()和conn.prepareStatement()的時候,實際上都是相當與在數據庫中打開了一個cursor。尤其是,如果你的createStatement和prepareStatement是在一個循環里面的話,就會非常容易出現這個問題。因為游標一直在不停的打開,而且沒有關閉。
一般來說,我們在寫Java代碼的時候,createStatement和prepareStatement都應該要放在循環外面,而且使用了這些Statment后,及時關閉。最好是在執行了一次executeQuery、executeUpdate等之后,如果不需要使用結果集(ResultSet)的數據,就馬上將Statment關閉,調用close()方法。