| 免费下载: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 及其用法。
需要具备以下条件才能使用新的全局属性:
- 一个简单的 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 属性 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 而且定制或绑定过程过程有错误,则返回码为非零值。
确认将 Universal Driver JAR 文件 db2jcc.jar 和 sqlj.zip 放入类的路径中。
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 };
}
}
|
翻译应用程序会生成一个标准 Java 源文件,以及一个 SQLJ 序列化配置文件(sqljapp_SJProfile0.ser)。
清单 2. 翻译 SQLJ 程序
C:\jcc_home3\jcc>sqlj sqljapp.sqlj |
这是一个简单的 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 |
此应用程序会在完成定制过程之后执行代码。此时将会调用 fun_checkJVM() 函数,这证明应用程序在完成定制过程之后没有调用 System.exit()。
现在看一看在定制过程出现错误后执行整个 Java 应用程序的场景。通过将属性值设为 false(db2.jcc.sqljToolsExitJVMOnCompletion=false),可以实现同样的操作。
在执行带错误参数的应用程序样例中,即使应用程序调用了 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,可以继续执行应用程序。
学习
- 参考有关 db2sqljcustomize and db2sqljbind 的信息中心部分,了解更多关于这些工具的信息。
- 在信息中心中了解更多关于 Customization of IBM Data Server Driver for JDBC and SQLJ 配置属性的定制 的内容。
- 在 developerWorks 上的 DB2 for Linux, UNIX, and Windows 了解更多关于 DB2 的内容。
- 了解更多 使用 DB2 开发 Java 应用程序 的内容。
- 在 developerWorks 中国网站 Information Management 专区 了解关于信息管理的更多信息。从那里可以找到技术文档、how-to 文章、培训、下载、产品信息以及更多内容。
- 随时关注 developerWorks 技术活动 和 网络广播。
- 观看 developerWorks 演示中心,包括面向初学者的产品安装和设置演示,以及为经验丰富的开发人员提供的高级功能。
获得产品和技术
- 使用可以直接从 developerWorks 下载的 IBM 产品评估试用版软件 构建您的下一个开发项目。
讨论
- 参与论坛讨论。
- 参与 developerWorks 博客 并加入 developerWorks 中文社区,developerWorks 社区是一个面向全球 IT 专业人员,可以提供博客、书签、wiki、群组、联系、共享和协作等社区功能的专业社交网络社区。
