Using Java DB for xml configurator persistence

来源:互联网 发布:linux 网络io监控 编辑:程序博客网 时间:2024/06/08 05:45

    应用通常以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

原创粉丝点击