为了提高关系数据库应用程序的性能,通常会使用存储过程,存储过程只不过是用户定义的功能,其中包含存储在数据库中的一系列 sql 语句。在本文中,我们将演示如何通过对 informix jdbc 驱动程序使用可调用语句来访问存储过程。
jdbc callablestatement 扩展了 preparedstatement,并向发送请求,以执行用于复杂操作(比如返回值或使用输入和输出存储过程参数)的存储过程。
在关系应用程序中,与单个 sql 语句相比,使用存储过程的主要优势在于查询计划(或执行计划)是在创建存储过程时生成的,并且需要对存储过程的每次执行重用相同的查询计划,这节省了服务器中的大量资源。创建存储过程之后,任何数据库客户端(如 jdbc 应用程序)都可以随意调用这些过程,无需制定新的执行计划。
使用存储过程的方式因数据库服务器而异。数据库管理系统 (dbms),如 informix 和 db2®,使用不同的 sql 语法来执行存储过程。当应用程序开发人员需要编写以多个 dbms 为目标的代码时,这使得事情变得更加困难。可调用语句提供了一个在所有 dbms 系统中使用相同的 sql 语句的执行存储过程的方法。
为何使用存储过程?
假设我们有一个 jdbc 应用程序,该应用程序需要高效地一次又一次重复某个任务序列。我们可能希望使用 java™ 方法,但我们希望进行多少次客户端/服务器通信来发送和接收数据呢?数据库服务器将为应用程序发送的每个 sql 语句准备并生成一个查询计划,这将占用一些 cpu 时间。尽管考虑到了性能,但对一个 sql 语句使用简单的 java 方法可能不太好。
使用存储过程(它只是一次性任务)会怎么样呢?创建一个 sql调用,并且您可以使用 callablestatement 对象从 jdbc 应用程序中调用它,callablestatement 对象充当了服务器上存储过程的调用方。大多数业务逻辑将位于存储过程上。这有助于简化客户端代码并会加快执行速度,因为在创建存储过程时就已经准备好了存储过程中包含的 sql 语句,并对这些语句进行了优化。
在 jdbc 应用程序中调用存储过程
informix jdbc 驱动程序提供了可用于执行存储过程的 statement、preparedstatement 和 callablestatement 方法。使用哪种方法取决于存储过程的特性。例如,如果存储过程返回一个值,那么应该使用 jdbc statement 对象。下表提供了哪个存储过程类型使用哪个方法的一些指南。
表 1. 显示基于各个存储过程类型要使用哪个 jdbc 方法的表
存储过程类型 jdbc 方法
存储过程不需要 in 或 out 参数 使用 statement 对象
存储过程具有 in 参数 使用 preparedstatement 对象
存储过程具有 in 和 out 参数 使用 callablestatement 对象
我们将提供一个在以下情况下使用 informix jdbc 方法执行存储过程的示例:
使用没有参数的 statement 使用具有输入参数的 preparedstatement 使用具有输出参数的 callablestatement callablestatement 中的已命名参数 过载的存储过程上面提到的每个主题将包含以下细节:
在 informix jdbc 驱动程序过程中调用存储过程所使用的语法 数据库上的存储过程的架构 具有输出的 jdbc 驱动程序示例程序