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

前端之家收集整理的这篇文章主要介绍了任何来自Java应用程序的Oracle 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中的 SDUTDU参数

要将当前法规的批量大小设置为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.

猜你在找的Java相关文章