我有一个在 Jboss AS 7 容器中运行的 Web 软件,它通过 JPA 将我们的数据保存在 PostgreSQL 9.1 数据库中,它的配置委托给 JTA。
去年它被改编为在 AWS EC2 云上运行。随着用户需求的增长,我们的数据库使用量也在增长。正如预期的那样,我们的数据库服务器在高峰时间变得忙碌,这影响了我们用户的使用体验。
在对 PostgreSQL 进行一些复制研究之后,我们意识到 PGPool2 可能是我们案例的一个很好的复制解决方案:它为 SELECT 查询提供负载平衡,并为 CUD 操作(更新、插入和删除)提供复制。
到目前为止一切都很好,只是它会使软件变慢。事实上,正如 PGPool2 文档中明确指出的那样,如果 SELECT 查询是在显式 BEGIN/END 事务中定义的,它将不会被负载平衡。
对于要进行负载平衡的查询,必须满足以下所有要求: - PostgreSQL 版本 7.4 或更高版本 - 查询不能在显式声明的事务中(即不在 BEGIN ~ END 块中) - 这不是 SELECT nextval 或 SELECT setval - 这不是 SELECT INTO - 这不是 SELECT FOR UPDATE 也不是 FOR SHARE - 它以“SELECT”或 COPY TO STDOUT、EXPLAIN、EXPLAIN ANALYZE SELECT 之一开头... - ignore_leading_white_space = true 将忽略前导空白。
两个问题:
- 我如何才能找出在显式事务中运行的 SELECT 查询?
- _javax.ejb.TransactionAttributeType.NOT_SUPPORTED_ 是否修复了事务范围,允许我的 SELECT 方法将作为“无事务”运行?