java传递结构体数组给oracle存储过程,性能太差了

ATCG 2012-06-15 11:04:31
如下程序,调用一次存储过程要 400豪秒,没法接受,可以接受的是 0.5豪秒以内,谢谢
import java.sql.*;
import java.util.*;
import oracle.jdbc.driver.*;
import oracle.sql.*;

public class test
{
public static void main(String args[]) throws Exception
{

DriverManager.registerDriver(new oracle.jdbc.driver.OracleDriver());
Connection con = DriverManager.getConnection("jdbc:oracle:oci8:@test","user","pass");
long time1 = System.currentTimeMillis() ;
OracleCallableStatement cstmt = (OracleCallableStatement) con.prepareCall("{call testInPersons(?)}");
StructDescriptor sd = new StructDescriptor("PERSON", con);
Object[] personAttrs1 = new Object[] { "This is code11", "100",new NUMBER(32), 200};
STRUCT person1 = new STRUCT(sd, con, personAttrs1);
Object[] personAttrs2 = new Object[] { "This is code22", "aaa", new NUMBER(33), 100 };
STRUCT person2 = new STRUCT(sd, con, personAttrs2);
ArrayDescriptor ad = new ArrayDescriptor("person_table_type".toUpperCase(), con);
ARRAY persons = new ARRAY(ad, con, new STRUCT[] { person1, person2 });
cstmt.setARRAY(1, persons);
cstmt.execute();

long time2 = System.currentTimeMillis() ;
System.out.println(time2-time1);
}
}
...全文
386 20 打赏 收藏 举报
写回复
用AI写文章
20 条回复
切换为时间正序
请发表友善的回复…
发表回复
dracularking 2012-06-21
  • 打赏
  • 举报
回复
哦 很看好生物科学,大有可为。
ATCG 2012-06-18
  • 打赏
  • 举报
回复
曾经做过bioinformatics行业,现在改行了
[Quote=引用 18 楼 的回复:]
楼主研究生物的?ATCG...
[/Quote]
dracularking 2012-06-18
  • 打赏
  • 举报
回复
楼主研究生物的?ATCG...
ATCG 2012-06-15
  • 打赏
  • 举报
回复
谢谢,那咋办呢?
[Quote=引用 2 楼 的回复:]
存储过程很快,不用怀疑,单单 cstmt.execute(); 执行少于1豪秒
现在currentTimeMillis()显示要200豪秒

我循环100次,要16秒,因此和currentTimeMillis()没啥关系了


引用 1 楼 的回复:
先定位问题主要是哪边。

你直接在SQL工具中测试该存储过程,时间开销如何?



话说。。。你知道 0.5 毫秒是啥概念……
[/Quote]
dracularking 2012-06-15
  • 打赏
  • 举报
回复
新建这些对象,消耗是挺“大”的
ATCG 2012-06-15
  • 打赏
  • 举报
回复
存储过程很快,不用怀疑,单单 cstmt.execute(); 执行少于1豪秒
现在currentTimeMillis()显示要200豪秒

我循环100次,要16秒,因此和currentTimeMillis()没啥关系了

[Quote=引用 1 楼 的回复:]
先定位问题主要是哪边。

你直接在SQL工具中测试该存储过程,时间开销如何?



话说。。。你知道 0.5 毫秒是啥概念不?currentTimeMillis()能统计出0.5毫秒差距不?
[/Quote]
MiceRice 2012-06-15
  • 打赏
  • 举报
回复
先定位问题主要是哪边。

你直接在SQL工具中测试该存储过程,时间开销如何?



话说。。。你知道 0.5 毫秒是啥概念不?currentTimeMillis()能统计出0.5毫秒差距不?
ATCG 2012-06-15
  • 打赏
  • 举报
回复
我现在也考虑写临时表,但是每天写的量很大,日志也很大
写临时表0.5豪秒也是不够的

[Quote=引用 15 楼 的回复:]
因为你的问题是创建对象消耗,时间长;话说从你4000字符都不够来看,你原始数据量就不小。
而字符串的消耗时间是相对稳定的,所以才提出创建字符串。


另一种毛招是直接把数据写入临时表,然后存储过程从临时表中处理。用batchExecute的话,写数据的性能倒是非常高。

总的来说,要达到0.5毫秒搞定,恐怕远没有这么乐观。
[/Quote]
MiceRice 2012-06-15
  • 打赏
  • 举报
回复
因为你的问题是创建对象消耗,时间长;话说从你4000字符都不够来看,你原始数据量就不小。
而字符串的消耗时间是相对稳定的,所以才提出创建字符串。


另一种毛招是直接把数据写入临时表,然后存储过程从临时表中处理。用batchExecute的话,写数据的性能倒是非常高。

总的来说,要达到0.5毫秒搞定,恐怕远没有这么乐观。
ATCG 2012-06-15
  • 打赏
  • 举报
回复
这每一步耗时我都测试过了,最后一步 EXECUTe就要 1豪秒

传字符串很快么?对于ORACLE来说,能够接收的最多4000字节。这个是不够用的

[Quote=引用 13 楼 的回复:]
引用 12 楼 的回复:
OCI 和THIN 都测试过了,一样,照理OCI应该更快


从目前主流的测试情况来看,基本都是Thin更快。Anyway,如果你已经测试过,那就没啥好细化的了。

无非是看能否进一步挖掘,这400毫秒究竟主要是消耗在这几句话中哪些了。


如果最终啥招都不行了,就最后一招:直接传一个大字符串进去(类似JSON或更简单的固定分割符方式),存储过程自行拆解……
[/Quote]
MiceRice 2012-06-15
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 的回复:]
OCI 和THIN 都测试过了,一样,照理OCI应该更快
[/Quote]

从目前主流的测试情况来看,基本都是Thin更快。Anyway,如果你已经测试过,那就没啥好细化的了。

无非是看能否进一步挖掘,这400毫秒究竟主要是消耗在这几句话中哪些了。


如果最终啥招都不行了,就最后一招:直接传一个大字符串进去(类似JSON或更简单的固定分割符方式),存储过程自行拆解该字符串。
ATCG 2012-06-15
  • 打赏
  • 举报
回复
OCI 和THIN 都测试过了,一样,照理OCI应该更快

[Quote=引用 11 楼 的回复:]
听起来有点匪夷所思。。。

不知道究竟是哪个对象的创建会这么慢,神奇。

另一种考虑是将OCI驱动换位Thin驱动,后者是纯Java驱动,这样可以大量减少JNI的转换开销。
[/Quote]
MiceRice 2012-06-15
  • 打赏
  • 举报
回复
听起来有点匪夷所思。。。

不知道究竟是哪个对象的创建会这么慢,神奇。

另一种考虑是将OCI驱动换位Thin驱动,后者是纯Java驱动,这样可以大量减少JNI的转换开销。
ATCG 2012-06-15
  • 打赏
  • 举报
回复
不好意思
仅执行 cstmt.execute() 耗费1豪秒
前面的话了400豪秒

[Quote=引用 8 楼 的回复:]
我晕,两个选项让你选其中一个,你就一句:“是啊”。。。。。。
[/Quote]
小坏猫 2012-06-15
  • 打赏
  • 举报
回复
毫秒?豪秒?
MiceRice 2012-06-15
  • 打赏
  • 举报
回复
我晕,两个选项让你选其中一个,你就一句:“是啊”。。。。。。
ATCG 2012-06-15
  • 打赏
  • 举报
回复
是啊
[Quote=引用 6 楼 的回复:]
发现所发帖子失败了。

请问下“单单 cstmt.execute(); 执行少于1豪秒”这句话是什么意思?
◎ 不设置数据,直接执行cstmt.execute()?那么存储过程也没啥好干的,必然很快。
◎ 设置了数据,但计时只计算cstmt.execute(); ?那么意味着前面 StructDescriptor、STRUCT、ARRAY 等这几句话就消耗了400毫秒?
[/Quote]
MiceRice 2012-06-15
  • 打赏
  • 举报
回复
发现所发帖子失败了。

请问下“单单 cstmt.execute(); 执行少于1豪秒”这句话是什么意思?
◎ 不设置数据,直接执行cstmt.execute()?那么存储过程也没啥好干的,必然很快。
◎ 设置了数据,但计时只计算cstmt.execute(); ?那么意味着前面 StructDescriptor、STRUCT、ARRAY 等这几句话就消耗了400毫秒?
内容概要:本文介绍了基于Matlab代码实现的电力系统机组组合优化调度方法,适用于IEEE14、IEEE30和IEEE118节点标准测试系统。该资源聚焦于电力系统中发电机组的优化调度问题,通过智能优化算法实现对机组启停、出力分配等决策的最优化,旨在降低运行成本、提升系统可靠性和经济性。文中系统阐述了从数学模型构建、多类型约束处理到优化算法设计与仿真实验验证的完整研究流程,并提供了可复现的Matlab代码,涵盖目标函数设定、约束条件建模及算法求解过程,适用于电力系统调度、能源优化等相关领域的科研与教学实践。; 适合人群:具备电力系统分析、运筹学基础及Matlab编程能力的高校学生、科研人员和工程技术人员,尤其适合从事电力系统优化、智能算法应用研究的研究生与青年学者。; 使用场景及目标:①用于电力系统机组组合(UC)问题的教学实验与课程设计;②支撑科研工作中对遗传算法、粒子群算法等智能优化算法在电力系统调度中应用的研究;③为含可再生能源接入的现代电网调度提供仿真平台与技术参考,助力低碳电力系统规划与运行。; 阅读建议:建议读者结合电力系统调度理论与优化建模知识,深入理解机组组合问题的数学本质与物理约束,再通过Matlab代码进行仿真实践,重点关注算法收敛性、多目标权衡策略与不同测试系统间的性能对比,以实现理论与实践的深度融合。
内容概要:本文研究了一种基于TCN-BiGRU-Attention混合神经网络模型的风电功率预测方法,旨在提升预测精度。该模型融合了时间卷积网络(TCN)对局部时序特征的强大提取能力、双向门控循环单元(BiGRU)对时间序列前后依赖关系的双向捕捉能力,以及注意力(Attention)机制对关键时间步特征的自适应加权聚焦能力。研究采用多变量输入方式,综合纳入风速、风向、温度等多种气象因素作为输入特征,实现风电功率的单步预测。通过对实际风电场数据的实验验证,该模型在预测精度方面相较于单一模型或其他组合模型展现出显著优势,有效降低了预测误差。; 适合人群:具备一定机器学习与深度学习基础,从事新能源预测、电力系统调度或相关领域研究的科研人员与工程技术人员。; 使用场景及目标:①应用于风电场功率实时预测,提升电网调度的稳定性与安全性;②为电力市场交易、储能配置和可再生能源消纳提供高精度数据支持;③作为深度学习模型融合设计的参考案例,推动时序预测技术的发展。; 阅读建议:此资源提供了完整的Matlab代码实现,读者在学习时应重点关注模型结构的设计原理、多变量特征的处理方式以及Attention机制的融入方法,建议结合代码进行复现实验,调整参数以深入理解各组件对最终预测性能的影响。

62,620

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧