任何来自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中的
SDU和
TDU参数
要将当前法规的批量大小设置为100. ((OracleStatement)stmt).setRowPrefetch (100); 注意:
(自Oracle Database JDBC Developer’s Guide and Reference起) 可用的连接属性here. 另外看看Oracle UCP. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |