实战 Java 存储过程的编写及在 DB2 上的部署【来源于网络】
????? 在一个设计良好的数据库应用中,存储过程(Stored Procedure)几乎是必不可少的。存储过程可以有效的节约查询的网络开销,并且降低应用部署的难度。Java 存储过程是 DB2 存储过程的一个重要分类,既拥有 Java 语言的灵活性又拥有一般存储过程的优点,同时可以让大量的 Java 开发人员只需经过简单的学习,就可以编写服务器端的存储过程应用。
????? DB2 对 Java 存储过程一直有着良好的支持,DB2 各个版本均自带有 JDK 并且已经配置妥当,用户无需复杂的操作即可直接开始部署 Java 存储过程。并且 DB2 已经提供了整套存储过程部署的工具以方便数据库管理人员。
??? 在 DB2 中 Java 存储过程是一个相对独立的模块,它运行于 JVM 之上而不是直接运行于数据库之中,与用 SQL 写成的存储过程相比,Java 存储过程的编写方法更类似于传统的 Java 应用。下图简单的表示了 DB2 中的执行 Java 存储过程的体系结构:
图 1. DB2 中的执行 Java 存储过程的体系结构
????? 当然,与一般的 Java 程序相比,Java 存储过程在其设计、编写过程中,还是有许多不同之处。本文之后的章节以一个 Java 程序员的角度,从一个简单的例子出发,逐步介绍了如何编写一个 Java 存储过程,并在 DB2 中进行部署及调用该存储过程。
存储过程参数示例Java 参数示例ININ in INTEGER不使用数组int inOUTOUT out INTEGER使用数组int[] outINOUTINOUT inout INTEGER使用数组int[] inout返回结果集IN in INTEGER无需定义ResultSet[] rs
?
读者可对照此表,修改自己需要的存储过程定义。
名称功能用法sqlj.install_jar将 JAR 文件安装到 DB2 服务器端CALL sqlj.install_jar( jar-url, jar-id )sqlj.replace_jar用一个新的 JAR 文件副本替换 DB2 服务器端存在的 JAR 文件CALL sqlj.replace_jar( jar-url, jar-id )sqlj.remove_jar从 DB2 服务器端删除 JAR 文件CALL sqlj.remove_jar( jar-id )sqlj.refresh_classes让 DB2 刷新 JAR 文件中包括的所有 class 文件以获得更新CALL sqlj.refresh_classes
注意:
如果更新了 class 文件或者 JAR 文件,需要调用 sqlj.refresh_classes 存储过程进行刷新,否则 DB2 实例仍然使用旧副本中的 Java class 文件。
例如,将 TestSP.class 打包到 TestSP.JAR 文件中之后,可以使用 CALL sqlj.install_jar( ' file:///<path>/TestSP.JAR ', 'TESTSP' ) 将其安装在 DB2 实例上;使用 CALL sqlj.replace_jar( ' file:///<path>/TestSP_NEW.JAR ', ' TESTSP ') 和 CALL sqlj.refresh_classes 将 DB2 实例上的 TestSP.JAR 更新为 TestSP_NEW.JAR;使用 CALL sqlj.remove_jar(' TESTSP ') 卸载这个 JAR 文件。
此图中笔者将工程的兼容性设置设置为了 JDK1.4,即在 1.4 以上的 JDK 上都可运行。
假如出现了 Java class 版本高于 JDK 版本造成不能加载的情况,可以通过查看 db2diag.log 里面的错误信息来发现。
例子:当用户将 DB2 的 JDK 配置为 1.4,并试图加载一个编译 Java 1.5 环境的存储过程时,可在 db2diag.log 里面看到如下出错信息。
清单 8 db2diag.log
2011-03-24-11.06.26.273703-240 I12591220A1084 LEVEL: Warning PID : 12903 TID : 12 PROC : db2fmp (Java) 0 INSTANCE: ccintapp NODE : 000 EDUID : 12 EDUNAME: db2fmp (Java) 0 FUNCTION: DB2 UDB, BSU Java support, sqlejLogException, probe:10 DATA #1 : String, 659 bytes java.lang.UnsupportedClassVersionError: com/ibm/sp/TestSP(Unsupported major.minor version 49.0) at java.lang.ClassLoader.defineClass0(Native Method) at java.lang.ClassLoader.defineClass(ClassLoader.java:539) at java.lang.ClassLoader.defineClass(ClassLoader.java:448) at com.ibm.db2.jcc.uw.classloader.b.a(b.java:236) at com.ibm.db2.jcc.uw.classloader.a.loadClass(a.java:85) at java.lang.ClassLoader.loadClass(ClassLoader.java:235) at com.ibm.db2.jcc.uw.classloader.PowerClassLoader.a(PowerClassLoader.java:71) at com.ibm.db2.jcc.uw.classloader.a.loadClass(a.java:85) at java.lang.ClassLoader.loadClass(ClassLoader.java:235) DATA #2 : Hexdump, 4 bytes 0xFFFFFFFF664FE4AC : 0000 0000
?
JDK 会抛出一个 UnsupportedClassVersionError 错误,在错误说明中出现的 49.0 是 Java 1.5 的内部版本号。
总结和结论
在一个设计良好的数据库应用中,存储过程(Stored Procedure)的使用几乎是必不可少的。使用存储过程可以有效的节约查询的网络开销,并且降低客户端应用部署的难度。对于许多初级的数据库开发人员来说,编写一个拥有复杂逻辑的存储过程是一件非常头疼的事情。Java 存储过程由于其高级语言的灵活性,是刚刚进入数据库领域的开发人员的非常好的选择。对于一个熟练的 Java 开发人员,只需经过简单的学习,就可以编写出完善的服务器端的存储过程应用。本文以一个 Java 程序员的角度,一步步的介绍如何编写出一个完整的数据库存储过程,并将其部署在 DB2 上以及通过 JDBC 的调用的完整步骤。最后本文介绍了一些编写存储过程经常会遇到的问题的解决方案。