Using Java DB for xml configurator persistence

    應用通常以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,原來有如下內容:

<security>
    
<user id="admin" password="admin" role="admin" />
    
<user id="userA" password="password" role="user" />
</security>

若要映射爲sql schema,可以定義如下結構的表

CREATE TABLE security(
    ID varchr2(
20),
    PASSWORD 
VARCHAR(20),
    ROLE 
VARCHAR(10)
);

可能熟悉數據庫應用的開發人員會比較喜歡這種方式,由此可以拋開煩人的xml,用熟悉的sql來定義配置信息了:-)。不過個人覺得這種方式往往使問題趨於複雜,且不夠靈活,因此推薦第2種方式,即使用JavaDB來存取xml內容。這樣即獲得了JavaDB的存取便利及安全性,又保留了xml原有的schema及xml本身具有的靈活性跟擴展性。在這種方式下,我們只需要有一個table:   

CREATE TABLE CONFIGURATORS (id VARCHR(20), content CLOB(500 K));

其中欄位content的DATATYPE爲CLOB,CLOB的上限爲2GB,對於普通xml已足夠。這裏設爲500 KB。
xml內容便以DATATYPE CLOB 放在content欄位內,以欄位id爲存取index。

資料初始化的 Source Code Sample:

java.io.File file = new java.io.File("path/to/security.xml");
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(
2new InputStreamReader(fin), fileLength);
ps.execute();

資料讀取的Source Code Sample:

ResultSet rs = s.executeQuery("SELECT content FROM CONFIGURATORS WHERE id = 'id01'");
   
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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章