我们的应用程序在启动时检查是否存在某些表、序列和其他一些东西。我们的程序是这样的:
...
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()中,也就是说,获取序列似乎是在这个服务器上花费了这么长的时间,而在另一个服务器上则花了几秒钟。有什么智慧会导致这一切的?
发布于 2021-12-16 10:19:10
我们找到了我们缓慢元数据查询的罪魁祸首!原因是在初始化过程中,我们将比较模式设置为LINGUISTIC,即执行:
alter session set nls_comp=LINGUISTIC;在设置为活动的情况下,检索序列(作为getMetaData()的一部分)需要5分钟!如果我们将其保留在默认位置(即alter session set nls_comp=BINARY),那么获取元数据只需1秒!
显然,比较模式会导致全表扫描,这会导致这种疯狂的查询持续时间。但是,我们需要这种比较模式,因为否则我们的许多查询都不会产生匹配(在我们的例子中,名称、公司名称、附件等等)。包含重音字符的。
我们“修正”了这个问题,在我们完成了验证某些表和序列存在的启动检查之后,在应用程序的稍后点切换比较模式。
如果有人知道一个方法,如何加快元数据的创建,即使在一个非默认的比较模式(例如,一个人可以创建一个特殊的索引或类似的)-请让我知道!
显然,这里必须包含一些额外的设置,因为--正如前面提到的--在我们以前的DB服务器上,即使将元数据提取模式设置为语言模式,元数据获取也只花费了1秒。
https://stackoverflow.com/questions/70264468
复制相似问题