了解最新的 DB2 Universal JDBC 驱动程序中的新增 JVM exit 属性

通过使用 DB2® Universal JDBC Driver 中新曾全局属性,现在您可以在使用完 SQLJ 工具(比如 db2sqljcustomize 和 db2sqljbind)时捕获 JVM exit 或 System.exit()。本文将介绍 JDBC Universal Driver 的通用属性 db2.jcc.sqljToolsExitJVMOnCompletion 及其用法。本文用一个 Java™ 应用程序样例演示如何设置这个新属性。

Sujan Ghosh, 软件工程师, IBM

Sujan GhoshSujan Ghosh 是印度 IBM 实验室的软件工程师,他加入 DB2 Java 通用连接和 pureQuery 客户端优化团队已有四年多时间。他的大多数项目都基于 DB2 和 Java 技术。他是 IBM 认证的 DB2 for Linux, UNIX, and Windows 的数据库管理员,以及 IBM 认证的 XML 解决方案开发人员。



2011 年 8 月 29 日

免费下载:IBM® DB2® Express-C 9.7.2 免费版 或者 DB2® 9.7 for Linux®, UNIX®, and Windows® 试用版
下载更多的 IBM 软件试用版,并加入 IBM 软件下载与技术交流群组,参与在线交流。

简介

在典型的企业应用程序环境中,DB2 应用程序通常会使用 SQLJ 工具 db2sqljcustomize 和 db2sqljbind。这些 SQLJ 工具会调用 Java 程序,而这些程序能提供了定制和绑定 SQLJ 应用程序所必需的工具。在目前的设计中,这些 Java 程序会使用 exit 代码返回到 shell。这是通过支持 JVM 的 System.exit() 调用来完成的。0(零)表示成功,非零返回代码表示定制或绑定过程错误。

System.exit() 表示 JVM 退出,它不适于某些绑定工具,比如 Ant 或 Maven,这些绑定工具需要连续的 JVM。过去,没有替代方法可用来捕获定制和绑定过程结束后的 System.exit 或 JVM exit。在这种情况下,您必须再次返回应用程序,以便继续处理其他业务逻辑。如果使用 shell 脚本运行这些工具,当然没问题,但在一些特殊工具(如 Ant)中,当 Java 程序调用 System.exit() 时,就会产生问题。例如,如果构建工具(如 Ant)使用的是不捕获 System.exit 的默认安全管理器,并且在和 Ant 一样的 JVM 中执行该操作,那么它在定制或绑定过程结束后就会退出。

在本文中,您将了解到新的 JDBC Universal Driver 全局属性 db2.jcc.sqljToolsExitJVMOnCompletion 及其用法。


先决条件

需要具备以下条件才能使用新的全局属性:

db2sqljcustomize 是用来处理包含嵌入式 SQL 语句的 SQLJ 配置文件的工具。默认情况下,定制器还需要绑定 DB2 包。

db2sqljbind 将之前定制的 SQLJ 配置文件绑定到数据库。

关于定制和绑定过程的详细信息,请访问 DB2 信息中心

  • 一个简单的 SQLJ 应用程序和 SQLJ 序列化配置文件: 一个带有嵌入式 SQL 语句的 Java 应用程序。翻译 SQLJ 应用程序会生成 .class 文件和一个或多个序列化配置文件。默认情况下,它会调用 Java 编译器。
  • 一个简单的 JDBC 应用程序:一个简单的包含 SQLJ 工具(比如 db2sqljcustomize 和 db2sqljbind)的 Java 应用程序。
  • IBM DB2 Universal Driver for SQLJ and JDBC:通用驱动程序是 com.ibm.db2.jcc.DB2Driver,包含在 db2jcc.jar 中。sqlj.zip 包含 SQLJ 翻译器。
  • 全局属性文件 DB2JccConfiguration.properties:此资源文件用于设置 db2.jcc.sqljToolsExitJVMOnCompletion 属性。该属性可在 DB2Configuration.properties 中进行设置,或通过 -D 将其传递给 Java 命令。还有其他可用来设置该属性的方法,请参阅信息中心的 IBM Data Server Driver for JDBC and SQLJ 配置属性的定制

新的 JCC 属性的优势

新的全局 JCC 属性 db2.jcc.sqljToolsExitJVMOnCompletion 提供了 Boolean 型返回值。此属性的默认值是 true,表示所有的 SQLJ 工具将会在完成以后调用 System.exit()。要在执行完 SQLJ 工具之后捕获 System.exit(),则需要将属性值设为 false:db2.jcc.sqljToolsExitJVMOnCompletion=false

默认情况下,无论是否发生错误,JVM 都会在调用 System.exit 后退出。无论是否发生错误,SQLJ 都会调用 System.exit。在将属性设置为 false 后,即使定制错误,也会将 0 返回到 shell 中。然后您可以通过编程方式使用 customizeMain 从方法获得返回码。

如果属性值设置为 db2.jcc.sqljToolsExitJVMOnCompletion=false 而且定制或绑定过程中有错误,则应用程序返回码为 0

如果属性值设置为 db2.jcc.sqljToolsExitJVMOnCompletion=true 而且定制或绑定过程过程有错误,则返回码为非零值。


应用程序样例的用例和配置

第 1 步:设置类的路径

确认将 Universal Driver JAR 文件 db2jcc.jar 和 sqlj.zip 放入类的路径中。

第 2 步:编写一个简单的 SQLJ 应用程序

SQLJ 应用程序连接到数据源对象为 ds 的数据库,并使用已定位的迭代器 ByPos 从现有的 Employee 表中获取行。

清单 1. SQLJ 程序从现有表中获取行:
import java.sql.*;

// Create connection context class DB2Connect
#sql context DB2Connect; 
			
// Declare positioned iterator ByPos
#sql  iterator ByPos(String,int);

public class sqljapp {

	public static void main(String[] args) throws Exception
	{ 
	// Create a DataSource object ds
	   javax.sql.DataSource ds = 
	    new com.ibm.db2.jcc.DB2SimpleDataSource();
					
	   ((com.ibm.db2.jcc.DB2BaseDataSource) ds).
		setServerName("localhost");

	   ((com.ibm.db2.jcc.DB2BaseDataSource) ds).
		setPortNumber(50000);

	   ((com.ibm.db2.jcc.DB2BaseDataSource) ds).
	      setServerName("localhost");

	   ((com.ibm.db2.jcc.DB2BaseDataSource) ds).
	      setDriverType(4); 
				   
	   java.sql.Connection con = 
	   ds.getConnection("administrator", "passwd");

	   // Creating connection context object db2con
	   DB2Connect db2con = new DB2Connect(con);

	   // Declare the object of ByPos class 
	   ByPos positer;

	   // Use db2con for executing an SQL statement
         #sql[db2con] positer= { select * from EMPLOYEE }; 
    	}

}

第 3 步:翻译 SQLJ 应用程序

翻译应用程序会生成一个标准 Java 源文件,以及一个 SQLJ 序列化配置文件(sqljapp_SJProfile0.ser)。

清单 2. 翻译 SQLJ 程序
C:\jcc_home3\jcc>sqlj sqljapp.sqlj

第 4 步:执行 Java 应用程序

这是一个简单的 Java 应用程序,它将参数传递给定制工具。您在一个单独的 JVM 中执行 Java 应用程序,没有使用新属性。此应用程序会使用 System.exit() 返回到调用方,并带有返回代码。如果定制执行成功,那么返回代码为 0。在使用完 db2sqljcustomize 工具之后,应用程序不会调用任何代码(fun_checkJVM 函数)。

清单 3. 未使用 db2.jcc.sqljToolsExitJVMOnCompletion 属性的 Java 应用程序
public class JVMexit {

	public static void main(String a[]) throws Exception {

		// Array of String as parameters to db2sqljcustomize
		String[] cmd = { "-url", "jdbc:db2://localhost:50000/SAMPLE", 
		"-user","administrator", "-password", "passwd", "-onlinecheck",
		"YES", "-rootPkgName", "BCB", "-collection", "COL18",
		"-tracefile", "trace_cust.txt", "-tracelevel", "TRACE_ALL",
		"sqljapp_SJProfile0.ser" };

		// Create an object of db2sqljcustomize
		com.ibm.db2.jcc.sqlj.Customizer cust = new 
		com.ibm.db2.jcc.sqlj.Customizer();

		// Execute the db2sqljcustomize with arguements
		cust.main(cmd);

		/* Function to check if JVM exited or not,if exited it will not call
		   below function or else it will.*/
		fun_checkJVM();

	}

	private static void fun_checkJVM() {
		System.out.println("JVM didn't exit");

	}

}

到目前为止,您已经看到如何在单独的 JVM 中不使用新的全局属性执行 Java 应用程序。(此属性的默认值为 true —db2.jcc.sqljToolsExitJVMOnCompletion=true)。现在我们看看以下场景,在全局属性文件 DB2JccConfiguration.properties 中将属性值设置为 db2.jcc.sqljToolsExitJVMOnCompletion=false,以执行同样的 Java 应用程序。

第 5 步:全局文件 DB2JccConfiguration.properties

创建名为 DB2JccConfiguration.properties 的资源文件,将它放入类路径,并添加属性,如下所示。

清单 4. DB2JccConfiguration.properties
//Add the property value as false in file
db2.jcc.sqljToolsExitJVMOnCompletion=false

第 6 步:执行 Java 应用程序

此应用程序会在完成定制过程之后执行代码。此时将会调用 fun_checkJVM() 函数,这证明应用程序在完成定制过程之后没有调用 System.exit()

现在看一看在定制过程出现错误后执行整个 Java 应用程序的场景。通过将属性值设为 false(db2.jcc.sqljToolsExitJVMOnCompletion=false),可以实现同样的操作。

第 7 步:执行带有错误参数的 Java 应用程序

在执行带错误参数的应用程序样例中,即使应用程序调用了 function fun_checkJVM(),定制/绑定过程中也会出现一个错误,这证明应用程序在完成定制过程之后未调用 System.exit()

清单 5. 带有错误参数的 Java 应用程序
public class JVMexit {

	public static void main(String a[]) throws Exception {

		// Array of String as parameters to db2sqljcustomize
		String[] cmd = { "-url", "jdbc:db2://localhost:5000/SAMPLE", 
		"-user","administrator", "-password", "passwd", "-onlinecheck",
		"YES", "-rootPkgName", "BCB", "-collection", "COL18",
		"-tracefile", "trace_cust.txt", "-tracelevel", "TRACE_ALL",
		"sqljapp_SJProfile0.ser" };

		// Create an object of db2sqljcustomize
		com.ibm.db2.jcc.sqlj.Customizer cust = new 
		com.ibm.db2.jcc.sqlj.Customizer();

		// Execute the db2sqljcustomize with arguements
		cust.main(cmd);

		/* Function to check if JVM exited or not,if exited it will not call
		   below function or else it will.*/
		fun_checkJVM();

	}
	private static void fun_checkJVM() {
		System.out.println("JVM didn't exit");

	}

}

结束语

在本文中,我们向您演示了在使用完 SQLJ 工具(比如定制和绑定工具)时,如何使用新属性 db2.jcc.sqljToolsExitJVMOnCompletion 捕获 System.exit()。一旦将属性值设为 false,即使 SQLJ 工具执行中出现错误,应用程序也不会退出 JVM,可以继续执行应用程序。

参考资料

学习

获得产品和技术

讨论

条评论

developerWorks: 登录

标有星(*)号的字段是必填字段。


需要一个 IBM ID?
忘记 IBM ID?


忘记密码?
更改您的密码

单击提交则表示您同意developerWorks 的条款和条件。 查看条款和条件

 


在您首次登录 developerWorks 时,会为您创建一份个人概要。您的个人概要中的信息(您的姓名、国家/地区,以及公司名称)是公开显示的,而且会随着您发布的任何内容一起显示,除非您选择隐藏您的公司名称。您可以随时更新您的 IBM 帐户。

所有提交的信息确保安全。

选择您的昵称



当您初次登录到 developerWorks 时,将会为您创建一份概要信息,您需要指定一个昵称。您的昵称将和您在 developerWorks 发布的内容显示在一起。

昵称长度在 3 至 31 个字符之间。 您的昵称在 developerWorks 社区中必须是唯一的,并且出于隐私保护的原因,不能是您的电子邮件地址。

标有星(*)号的字段是必填字段。

(昵称长度在 3 至 31 个字符之间)

单击提交则表示您同意developerWorks 的条款和条件。 查看条款和条件.

 


所有提交的信息确保安全。


static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=10
Zone=Information Management, Java technology
ArticleID=754516
ArticleTitle=了解最新的 DB2 Universal JDBC 驱动程序中的新增 JVM exit 属性
publish-date=08292011