暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Oracle DB和java应用程序之间的非常慢的网络交互

askTom 2018-01-10
581

问题描述

我的Oracle DB网络速度有问题。

首先,问题的实质是什么。我的计算机上有java应用程序,远程服务器上有Oracle DB。它们之间的连接速度约为2.5 mb/s。我在我的java应用程序中执行一个非常简单的查询,如 “选择id,名称从table_name”,结果集包含〜60k行 (大小约为1,5 Mb),并传输到我的应用程序约80秒。因此,对于探查器,应用程序在oracle.net.Packet.Receieve方法中花费的大部分时间。

为了进行比较,相同的查询在SQL Developer中执行0,5-0,7秒的5000行。推断到60k行,我们大约有6-8秒。

我的应用程序执行tcpdump的结果表明,数据以块的大小约为200字节。另一方面,SQL Developer tcpdump显示的包大小超过2000字节。

官方Oracle文档建议增加SDU和TDU参数,不幸的是我不能改变数据库的配置,所以我试图以这样的方式在客户端确定它们:

jdbc:oracle:thin:@(DESCRIPTION=(SDU=11280)(TDU=11280)(ADDRESS=(PROTOCOL=tcp)(HOST=)(PORT=1521)(SEND_BUF_SIZE=11784)(RECV_BUF_SIZE=11784))(CONNECT_DATA=(SERVICE_NAME=)))

但这并没有带来任何变化。数据库或ojdbc驱动程序可以忽略此参数吗?或者我走错了路?

专家解答

自Oracle Net 8.0以来,TDU已弃用并被忽略。SDU默认为8192。所以这不太可能是为什么你只得到200字节块。但是,请询问您的dba是否已设置SDU和TDU参数,如果是,该怎么办!

同时,检查每次往返要获取多少行。getFetchSize方法告诉你这个和setFetchSize改变它:

https://docs.oracle.com/javase/7/docs/api/java/sql/Statement.html#setFetchSize(int)

这控制客户端在每个请求上获取多少行。在SQL * Plus中等效的是arraysize。如以下示例所示,当将其设置为低值 (10) 时,与1,000时相比,获得结果所需的时间要长得多 (1分钟vs 21分钟!):

SQL> create table t as
  2    select * from dba_objects;

Table created.

SQL>
SQL> select count(*) from t;

  COUNT(*)
----------
     79175

SQL>
SQL> set feed only
SQL> set timing on
SQL> set arrays 1000
SQL> select * from t;

79175 rows selected.

Elapsed: 00:01:00.03
SQL>
SQL> set arrays 10
SQL> select * from t;

79175 rows selected.

Elapsed: 00:21:40.63


如果这没有帮助,请查看《网络服务故障排除指南》:

https://docs.oracle.com/cd/E11882_01/network.112/e41945/trouble.htm#NETAG016

另外: 您真的需要一次获取所有60k行吗?这里肯定有某种形式的分页?
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论