0
回答
最新的 DB2 Universal JDBC 驱动程序中的新增 JVM exit 属性
利用AWS快速构建适用于生产的无服务器应用程序,免费试用12个月>>>   

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

简介

在典型的企业应用程序环境中,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 及其用法。

先决条件

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

  • 一个简单的 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 后,即使定制错误,也会将 返回到 shell 中。然后您可以通过编程方式使用 customizeMain 从方法获得返回码。

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

如果属性值设置为 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() 返回到调用方,并带有返回代码。如果定制执行成功,那么返回代码为 。在使用完 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,可以继续执行应用程序。

文章转自 IBM developerWorks

举报
IBMdW
发帖于6年前 0回/366阅
顶部