應用通常以xml格式來存取配置信息。比較常見的方式是將不同方面的設定內容存爲不同的xml文件,比如應用JSample有2個設定文件:security.xml跟connection.xml。這種存取方式在某些情況下可能不符合應用的要求,比如應用不希望暴露配置的原始xml內容,規定用戶必需經應用提供的界面來訪文配置內容。當然,要防止用戶直接訪問原始xml,可以用加密xml文件的方式,讓用戶無法直接看到xml文件的內容。不過JavaDB出現以後,我們或許可以多一種選擇,即用JavaDB作爲配置信息的存取媒介。JavaDB可以嵌入應用中運行,非常適合於應用緩存並管理一些複雜的信息。
使用JavaDB來存取應用的設定信息,可以有2種方式。第1種是放棄原有的xml schema,重新以關係的角度來定義sql schema。比如應用JSample的設定文件security.xml,原來有如下內容:
<user id="admin" password="admin" role="admin" />
<user id="userA" password="password" role="user" />
</security>
若要映射爲sql schema,可以定義如下結構的表
ID varchr2(20),
PASSWORD VARCHAR(20),
ROLE VARCHAR(10)
);
可能熟悉數據庫應用的開發人員會比較喜歡這種方式,由此可以拋開煩人的xml,用熟悉的sql來定義配置信息了:-)。不過個人覺得這種方式往往使問題趨於複雜,且不夠靈活,因此推薦第2種方式,即使用JavaDB來存取xml內容。這樣即獲得了JavaDB的存取便利及安全性,又保留了xml原有的schema及xml本身具有的靈活性跟擴展性。在這種方式下,我們只需要有一個table:
其中欄位content的DATATYPE爲CLOB,CLOB的上限爲2GB,對於普通xml已足夠。這裏設爲500 KB。
xml內容便以DATATYPE CLOB 放在content欄位內,以欄位id爲存取index。
資料初始化的 Source Code Sample:
int fileLength = (int) file.length();
java.io.InputStream fin = new java.io.FileInputStream(file);
PreparedStatement ps = conn.prepareStatement("INSERT INTO CONFIGURATORS VALUES (?, ?)");
ps.setString(1, "security");
ps.setCharacterStream(2, new InputStreamReader(fin), fileLength);
ps.execute();
資料讀取的Source Code Sample:
while (rs.next()) {
StringBuffer content = new StringBuffer();
java.sql.Clob aclob = rs.getClob(1);
java.io.Reader reader = aclob.getCharacterStream();
int chr = reader.read();
while(chr > 0){
content.append((char)chr);
chr = reader.read();
}
//or another way...
java.io.Reader aReader = rs.getCharacterStream(1);
int c = aReader.read();
while (c > 0) {
content.append((char)c);
c = aReader.read();
}
}
--END