首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >JDBC : connection.getMetaData()需要花费很长时间--知道为什么以及如何加快速度吗?

JDBC : connection.getMetaData()需要花费很长时间--知道为什么以及如何加快速度吗?
EN

Stack Overflow用户
提问于 2021-12-07 17:27:05
回答 1查看 107关注 0票数 0

我们的应用程序在启动时检查是否存在某些表、序列和其他一些东西。我们的程序是这样的:

代码语言:javascript
复制
...
MetaData meta = connection.getMetaData();
...
ResultSet tables = meta.getTables(...);
... <checking for the presences of specific tables>
ResultSet sequences = meta.getSequences(...);
... <checking for the presences of specific sequences>
etc.
...

到目前为止,最初的connection.getMetaData()-call总是有一个亚秒的持续时间,在转到一个更大、更强大和共享的Oracle之后,这个调用现在可以重复使用超过5分钟(!)。这一次直接进入我们的应用程序的启动时间,它已经翻两番以上,这当然是一个大的不去!

知道为什么这个JDBC调用在一个系统上花费这么长时间,而在另一个系统上却不需要这么长时间吗?是否有任何选项或设置可以加快这一进程?这两个数据库都报告为"Oracle数据库11g发布11.2.0.4.0-64位产品“。这两台服务器都在我们的内部网中,所以从网络上来说,它们应该是同样可以访问的。新的一个CPU和RAM的功能要强大得多,并且配置在一个失败的配置中(即连接URL包含两个服务器,以防其中一个停机或无法到达)。旧的是一台简单的单机装置.

任何其他可能与此相关的东西,或者解释为什么那个电话现在要花那么多时间?

增编:

我们试着调试到这个方法中(但没有取得多大进展)。但是罪魁祸首似乎是在DatabaseMetadata.initSequences()中,也就是说,获取序列似乎是在这个服务器上花费了这么长的时间,而在另一个服务器上则花了几秒钟。有什么智慧会导致这一切的?

EN

回答 1

Stack Overflow用户

发布于 2021-12-16 10:19:10

我们找到了我们缓慢元数据查询的罪魁祸首!原因是在初始化过程中,我们将比较模式设置为LINGUISTIC,即执行:

代码语言:javascript
复制
alter session set nls_comp=LINGUISTIC;

在设置为活动的情况下,检索序列(作为getMetaData()的一部分)需要5分钟!如果我们将其保留在默认位置(即alter session set nls_comp=BINARY),那么获取元数据只需1秒!

显然,比较模式会导致全表扫描,这会导致这种疯狂的查询持续时间。但是,我们需要这种比较模式,因为否则我们的许多查询都不会产生匹配(在我们的例子中,名称、公司名称、附件等等)。包含重音字符的。

我们“修正”了这个问题,在我们完成了验证某些表和序列存在的启动检查之后,在应用程序的稍后点切换比较模式。

如果有人知道一个方法,如何加快元数据的创建,即使在一个非默认的比较模式(例如,一个人可以创建一个特殊的索引或类似的)-请让我知道!

显然,这里必须包含一些额外的设置,因为--正如前面提到的--在我们以前的DB服务器上,即使将元数据提取模式设置为语言模式,元数据获取也只花费了1秒。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70264468

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档