【发布时间】:2014-09-18 15:13:53
【问题描述】:
Java 导入 sn-p:
import oracle.sql.StructDescriptor;
import oracle.sql.ARRAY;
import oracle.sql.ArrayDescriptor;
import oracle.sql.STRUCT;
PLSQL代码sn-p:
one_user_type:
CREATE OR REPLACE TYPE one_user_type ABCD IS OBJECT
(
user_id VARCHAR2(120),
user_name VARCHAR2(120)
)
Java 代码 sn-p:
// 连接连接;
Object[] userObject1 = new Object[] {
"101", "peter" };
StructDescriptor userDescriptor = StructDescriptor
.createDescriptor("one_user_type", conn);
// The below line takes 2.5 seconds approx to execute.
STRUCT user1 = new STRUCT(userDescriptor, conn, userObject1);
注释:ojdbc6.jar; jdk1.6、Oracle 11g
问题 - 知道为什么这会花费太多时间,以及如何减少时间吗?
编辑 1 回应@Lalit Kumar B cmets:“太多时间”与实际查询执行有关。创建 STRUCT 是为了将记录表/对象表传递给 PLSQL 过程。实际的查询执行只需要 93 毫秒,而当调用两个这样的过程时 UI 等待大约 5 秒,它们都获取对象表和我们需要创建 STRUCT 的位置。 因此 2.5 秒被认为是这么多,我喜欢对其进行微调。当我检查其他 Java 对象构造、转换、查询执行等的执行时间时,与这个 STRUCT 创建相比,它们都非常低。 考虑到我真正调用 5 个以对象表作为参数的存储过程的场景,我进行了 5 次不同的调用来为每个存储过程创建 STRUCT,仅创建 STRUCT 总共需要大约 7 秒。这个想法是调用过程,获取结果,放入包装器并发送回 UI。
编辑 2:[09/20] 为了最大限度地缩短时间,创建了一个过程,该过程接受一个对象表并充当内部调用 5 个过程的包装器。因此,从 Java 代码来看,它只是一个存储过程调用。尽管如此,必须创建一次 STRUCT 以作为包装程序的输入。在多次运行时,它观察到 STRUCT 创建可以在 2 秒到 8 秒之间进行!我在创建 STRUCT 的方式上做错了吗?我从下面提供的链接中检查了 Oracle 文档,但我无法确定我是否偏离了。
如果您需要更多详细信息,请告诉我。
更新:创建 STRUCT 对象和描述符 http://docs.oracle.com/cd/B12037_01/java.101/b10979/oraoot.htm
编辑 3:解决方案的附加组件[09/23] 公认的解决方案是存储单个对象的理想选择。如果要传递对象表,情况如下:
PLSQL:
TYPE one_user_table_type IS TABLE OF one_user_type; // Table of Objects
Java:
UserType user = new UserType( "101", "Peter" );
ArrayDescriptor arrayDescriptor = ArrayDescriptor.createDescriptor(
"ONE_USER_TABLE_TYPE", conn);
UserType[] userArray = { user };
Array users = new ARRAY(arrayDescriptor, conn, userArray );
callableStatement.setArray(1, users);
【问题讨论】:
-
Too much time在技术上无法与您认为的更短时间框架相比。所以,请发布所需的详细信息,如经过的时间、执行计划等。现实世界中的 2.5 秒被认为是相当快的,也许你眨了两次眼睛。但如果您不这么认为,则需要提供所要求的详细信息。 -
@LalitKumarB,谢谢,用编辑 cmets 更新
-
好的,现在你离得到答案有点近了。但是,我想知道为什么需要 PL/SQL,如何使用纯 SQL 将结果集返回给 UI?它将减少 PL/SQL 和 SQL 这两个引擎之间的
context switching。 -
还有一个重要的,是并发操作还是隔离?
-
为什么是PLSQL程序? bcoz 数据通过 PLSQL 包和过程进行处理/检索/管理。 UI Java PLSQL 。其隔离操作[串行执行]