当前位置: 首页 > 知识库问答 >
问题:

Spring NamedParameterJdbcTemplate查询的性能非常慢

倪德业
2023-03-14

我正在处理一个需要JDBC调用Oracle数据库的项目。我已经设置了UCP池化来与SpringJDBC一起工作。我有一个相当简单的查询,我正在执行如下...

从ID所在的表中选择*(:ID)

我的java代码来设置这个查询看起来像下面...

NamedParameterJdbcTemplate template = new NamedParameterJdbcTemplate(datasource);
Map<String,Object> paramMap = new HashMap<String,Object>();
paramMap.put("ids", Arrays.asList(idArray));

List<Result> results = template.query("SELECT * FROM TABLE WHERE ID IN (:ids)",
    paramMap, new ResultRowMapper());

只要数组中只有一个id,这一切都可以正常运行。当我添加第二个ID时,查询需要将近5分钟的时间运行。如果我获取精确的查询并在SQLDeveloper中执行它,则需要.093秒。

我的代码或配置一定出了大问题...有人有什么想法吗?

编辑:

我去掉了Spring NamedParameterJdbcTemboard的用法,只使用了直接的Jdbc,一切似乎都很好。NamedParameterJdbcTemboard的不同之处是什么?

共有1个答案

艾浩广
2023-03-14

在这种情况下,我发现了我的直接jdbc解决方案和spring-jdbc解决方案之间的区别...正如@Annjawn在下面解释的那样,这似乎是一个绑定变量问题,而不是spring-jdbc问题。我的spring-jdbc问题是试图将一个变量绑定到一个索引(不存在),从而进行表扫描...

我的直接JDBC解决方案最终只是做一个字符串替换并执行,因此没有表扫描...

下面的链接解释了这种差异。

http://bytes.com/topic/oracle/answers/65559-jdbc-oracle-beware-bind-variables

 类似资料:
  • 问题内容: 每次执行此查询需要200毫秒以上的时间: 但这每次在第一次查询后每次执行只需要2-3毫秒: 注意在两个查询中相同的ID值。看起来第二个查询使用第一个查询的缓存结果。但是,为什么第一个查询不能使用缓存的结果本身?从第一个查询中删除不会更改任何内容。 当我使用其他ID执行第二个查询时,第一次执行该查询大约需要40毫秒,此后每次需要2-3毫秒。因此,第二个查询不仅运行速度更快,而且还缓存结果

  • 我正在对一个小表执行一个简单的查询 系统表只有三列(Id、Name、Progress)和1300行。 我获取数据的代码是: 这段代码在JTable中显示日期大约需要15秒,而如果在phpmyadmin中执行查询,则需要不到1秒。

  • 问题内容: 为什么简单地更新此表以添加列需要一个多小时?该表有1500万行。它具有2个索引和一个键主键。ALTER TABLE查询现在已处于“复制到tmp表”状态1小时15分钟。 表: 问题答案: 对于非常大的表,MySQL的ALTER TABLE性能可能会成为问题。MySQL通过创建一个具有所需新结构的空表,将旧表中的所有数据插入新表中,然后删除旧表来执行大多数更改。这可能会花费很长的时间,特别

  • 问题内容: 我有一个表,其中有一个索引(A列,B列)。我正在运行一个查询,如下所示: 这个查询很慢!该计划如下所示: Postgres似乎没有一次对5000个值进行一次索引扫描,而是一次对5000个值进行了一次索引扫描,这解释了为什么查询如此缓慢。 实际上,这样做是更快的方法: 获取结果,然后在应用程序内的B列上进行过滤(python)。 我真的更希望结果已经由Postgres在合理的运行时间下进

  • 问题内容: 在数据库表上运行sp_executesql时遇到一些问题。我使用的是ORM(NHibernate),在这种情况下,该ORM(NHibernate)生成查询一个表的SQL查询。该表中大约有700万条记录,并且已被高度索引。 当我运行没有sp_executesql的ORM吐出的查询时,它运行非常快,并且探查器显示它具有85次读取。当我使用sp_executesql运行相同的查询时,它的读取

  • 我正在使用jaydebeapi(Mac OS X)查询Netezza数据库,并执行一些快速/肮脏的计时: 完成大约需要10分钟(平均超过10次)。 现在,当我使用WinSQL(Windows7,ODBC)运行相同的SQL查询时,返回数据大约需要3分钟。我似乎不明白为什么在Python中要花这么长的时间,也不确定如何或从哪里开始寻找。