首页 > 解决方案 > Java Springboot Hibernate 设置 Oracle 数据库会话参数

问题描述

我们的数据库管理员推荐了一个特定的微服务,我改变了它的会话。

alter session set optimizer_dynamic_sampling=2;

微服务服务于一个非常特殊的用例,它正在搜索大量订单(数据分为 3 个表),因此它可以将分页结果返回给用户,在 SQL 开发人员会话中进行此会话更改后,查询时间被缩短一半。

我们的微服务是基于 Java Springboot 的,我们使用的是 JPA(Hibernate 实现),这是一个正在连接的 Oracle 数据库。正在运行的查询是本机查询。我只需要更改一次会话。出于明显的性能原因,我不想每次运行查询时都运行更改语句。话虽如此,如何确保 JPA 在我的池中创建的每个连接都使用此属性更新其相应的会话?似乎实体管理器工厂或实体管理器可以提供这个..只是无法找到关于它的详细文档。

进一步说明.. 根据当前实现(该服务已经存在 2 年了),每次运行本机查询时都会创建并关闭一个实体管理器。尚无法确定这是否会导致性能下降甚至导致性能下降。

欢迎所有提示/想法。谢谢!

标签: javaoraclespring-boothibernatejpa

解决方案


在玩了一些之后,我发现这个 alter session 语句实际上可以作为 SQL 提示在线添加。

SELECT /*+ dynamic_sampling(2) */ <your columns and rest of query>

所以我会将此提示添加到当前正在运行的本机查询中。关于这个提示的语法没有很多文档,所以有一些试验和错误。


推荐阅读