加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

任何来自Java应用程序的Oracle TNS低效率(许多往返,延迟)的解决

发布时间:2020-12-14 05:47:37 所属栏目:Java 来源:网络整理
导读:我正在研究一个非常慢的SQL查询(源自使用JBoss 5.1中部署的Hibernate的 Java应用程序).此特定查询返回了大约10K记录,但仍然需要40秒或更多. 我最终用数据库嗅探了流量(wireshark有一个TNS的解剖器)并发现了一些意想不到的东西.当数据来自服务器时,每个结果行
我正在研究一个非常慢的SQL查询(源自使用JBoss 5.1中部署的Hibernate的 Java应用程序).此特定查询返回了大约10K记录,但仍然需要40秒或更多.

我最终用数据库嗅探了流量(wireshark有一个TNS的解剖器)并发现了一些意想不到的东西.当数据来自服务器时,每个结果行都在其自己的TNS数据包中.此外,在从数据库发送下一个TNS分组之前,客户端(即app服务器)确认每个TNS分组.对于10K记录,有10K往返来获取数据包并确认它.对性能的影响是巨大的.

这非常低效. TCP允许更大的数据包并具有许多机制(滑动窗口,延迟的ACK)以减少延迟并提高吞吐量.但是,在这种情况下,它是顶部的TNS协议,它增加了自己的协商.

如果我从Oracle的SQL Developer运行相同的查询,我看不到这种模式.查询在大约1/10的时间内完成,没有数千次往返.

简短版本:Oracle的有线协议(TNS)似乎在每个查询结果行的一个TNS数据包中传递数据,并要求在服务器发送下一个数据包之前由客户端确认每个数据包.

我已经找到了一些关于这个[这里] [1]的信息(向下滚动直到关于’tnsnames.ora文件中的SDU和TDU参数’部分).

因此我的问题是:是否可以控制Oracle驱动程序的行为(我使用10.2.0.4.0),因此TNS协议更有效?同样,这是一个在JBoss中部署的非常标准的J2EE应用程序.

非常感谢!

解决方法

调整tnsnames.ora和listener.ora中的 SDU和 TDU参数

要将当前法规的批量大小设置为100.

((OracleStatement)stmt).setRowPrefetch (100);

注意:

Setting the prefetch size can affect
the performance of an application.
Increasing the prefetch size will
reduce the number of round-trips
required to get all the data,but will
increase memory usage. This will
depend on the number and size of the
columns in the query and the number of
rows expected to be returned. It will
also depend on the memory and CPU
loading of the JDBC client machine.
The optimum for a standalone client
application will be different from a
heavily loaded application server. The
speed and latency of the network
connection should also be consideredconnection should also be considered

(自Oracle Database JDBC Developer’s Guide and Reference起)

可用的连接属性here.

另外看看Oracle UCP.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读