Java Hibernate 查询中没有负载均衡注释

问题描述 投票:0回答:2

我们在 Java 项目中使用 pgPool 在 Postgres 数据库中进行负载平衡。

pgPool 向从属服务器发送只读查询,向主服务器发送写入查询。没关系。

但是在我们的应用程序中存在非常特殊的情况,当我们需要仅在主服务器中执行查询时。

pgPool提供了以下机制:

/*NO LOAD BALANCE*/ SELECT * FROM user;

上面的查询将始终在主服务器中执行。

我搜索了很多,但是虽然可以在手动查询中设置注释(Query 类中有一个 setComment()),但我找不到使用 Hibernate 存储库和从方法名称创建的查询来做到这一点的方法.

示例:

public interface UserRepository extends Repository<User, Long> {
    List<User> findByEmailAddressAndLastname(String emailAddress, String lastname);
}

如何在此查询中添加评论?

java postgresql hibernate load-balancing pgpool
2个回答
0
投票

嗯,这并没有回答原来的问题,但我已经使用不同的方法解决了这个问题。

我通过阅读 pgPool 文档的这一部分找到了解决方案:http://www.pgpool.net/docs/latest/pgpool-en.html#condition_for_load_balance

因此,使用 @Transactional 注解 Java 方法或类可以实现将查询路由到主服务器的预期结果。

使用此注释时,pgPool 会将 WRITE 查询(包括)之后发出的所有查询路由到 Postgres 主服务器。

如果您没有 WRITE 查询,则可以通过使用 @Transactional(isolation=Isolation.SERIALIZABLE) 注释来获得结果 - 如果使用 Spring。但请注意,此隔离级别是最严格的可用隔离级别。


0
投票

我必须在使用

Spring Data
Hibernate
的项目中做同样的事情。我重写了
org.hibernate.dialect.Dialect#addSqlHintOrComment
方法并为 Hibernate 的
@QueryHint
添加了自定义包装器。更多详情可以查看这里

© www.soinside.com 2019 - 2024. All rights reserved.