为DB2 XML数据开发Java应用程序
数据库配置参数
本文中的例子很简单,它们处理少量的 XML 数据,所以您不需要更改默认的数据库配置参数也能让它们运行。但是默认值对一些生产环境来说可能是不够的。具体来说,日志大小、Java 堆、查询语句堆和应用程序堆的设置值可能需要增加。如果这些值设置得不适当,那么运行时性能可能会很低,或者由于日志空间不够而不能将大型 XML 文档插入 DB2 表中。
可以从 DB2 Control Center(选择 Tools > Configuration Assistant)或 DB2 命令行处理器查看和更改 DB2 数据库配置参数。有关详细信息,请参考产品手册。
连接数据库
处理 DB2 XML 数据需要建立到包含数据的数据库的连接。关于该代码没有什么特殊的 —— 与编写到任何 DB2 数据库的连接的逻辑相同。
清单 2 包含一个 Helper 类,其中具有用于建立和关闭 DB2 数据库连接的方法。
清单 2. 用于获得和释放数据库连接的 Helper 类
public class Conn {
// for simplicity, I've hard-coded account and URL data.
private static String user = "user1";
private static String pwd = "mypassword";
private static String url = "jdbc:db2:test";
// this method gets a database connection
public static Connection getConn(){
Connection conn=null;
// load the appropriate DB2 driver and
// get a connection to the “test” database
try {
Class.forName("com.ibm.db2.jcc.DB2Driver");
conn = DriverManager.getConnection(url, user, pwd);
. . .
}
catch (Exception e) { e.printStackTrace();}
return conn;
} // end getConn();
// this method closes a database connection
public static void closeConn(Connection conn){
try {
if(conn == null) { return; }
conn.close();
}
catch (Exception e) { e.printStackTrace(); }
finally {
try { conn.close(); }
catch (Exception e) { }
}
} // end closeConn();
} // end class
您将在执行广泛任务(比如插入和查询 XML 数据)的应用程序中调用这些方法。
插入 XML 数据
由于最初的 XQuery 规范没有解决数据库写操作(比如插入数据),所以 DB2 依赖于熟悉的 SQL INSERT 语句来允许程序员将新的 XML 数据写入包含 XML 列的表中。DB2 最多可存储 2 GB 格式良好的 XML 文档。
通常,Java 程序员需要将包含在文件中的 XML 数据插入到 DB2 中,尽管也可以从字符串、二进制数据(包括大对象)和 SQL 子选择语句插入 XML 数据。这里介绍了如何从文件和简单的字符串插入 XML 数据。有关其他插入场景的详细信息,请参考 DB2 Viper 手册。
DB2 Viper 也允许您插入 XML 文档时针对以前注册的 XML 模式进行验证或不进行验证。本文中的例子介绍了这两种方法。
插入文件时不进行验证
清单 3 中的 insertFile() 方法演示了如何将 XML 文件中的数据插入 "clients.contactinfo" 列。该方法首先定义几个变量供以后使用。前 3 个变量对应于 "clients" 表中的 ID、name 和 status 列。第 4 个是将要插入 "contactinfo" 列的 XML 文件的名称。为简单起见,值已经硬编码在该方法中;在生产环境中,输入值将以不同的方式获得。
在建立数据库连接之后,为 INSERT 语句创建一个简单的字符串。如您所见,它看起来与任何其他 DB2 INSERT 语句一样,并对四个输入列值使用参数标志符(marker)。INSERT 语句像平常一样准备好了,它的四个参数标志符也设置好了。要为 XML 列设置标志符,需打开一个 FileInputStream,并传递 XML 文件的位置。也获得该文件的长度,并使用该信息作为 setBinaryStream() 方法的输入。最后,执行该语句,检查错误,并关闭连接。
清单 3. 从文件插入 XML 数据
public static void insertFile(){
try {
// for simplicity, I've defined variables with input data
int id = 1885;
String name = "Amy Liu";
String status = "Silver";
String fn = "c:/XMLFiles/Client1885.xml"; // input file
![]()
// get a connection
Connection conn = Conn.getConn();
![]()
// define string that will insert file without validation
String query =
"insert into clients (id, name, status, contactinfo) values (?, ?, ? ,?)";
![]()
// prepare the statement
PreparedStatement insertStmt = conn.prepareStatement(query);
insertStmt.setInt(1, id);
insertStmt.setString(2, name);
insertStmt.setString(3, status);
File file = new File(fn);
insertStmt.setBinaryStream(4, new FileInputStream(file), (int)file.length());
![]()
// execute the statement
if (insertStmt.executeUpdate() != 1) {
System.out.println("No record inserted.");
}
. . .
conn.close();
}
catch (Exception e) { . . . }
}
