我们在 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);
}
如何在此查询中添加评论?
嗯,这并没有回答原来的问题,但我已经使用不同的方法解决了这个问题。
我通过阅读 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。但请注意,此隔离级别是最严格的可用隔离级别。
我必须在使用
Spring Data
和 Hibernate
的项目中做同样的事情。我重写了 org.hibernate.dialect.Dialect#addSqlHintOrComment
方法并为 Hibernate 的 @QueryHint
添加了自定义包装器。更多详情可以查看这里