0

在 CentOS 上设置好 PgPool 的所有可能设置后,当我使用我的 Java 应用程序对其进行测试时,我发现它无法正常工作。
在阅读了互联网上的手册(您可以在此处找到)后,我发现如果 JDBC 语句已设置为 false(用于自动提交),它将无法正常工作。
由于我使用的是 Hibernate,所以我很确定它正在使用事务来设置值。
我的问题是,如果这是真的,哪种方法对复制我的数据库有用。我听说过并行模式,但我不确定它是否适用于 Java 应用程序。任何人都可以指导并为我提供样品吗?

4

2 回答 2

2

如果通过并行模式您的意思是事务隔离级别,从这个页面您可以看到PostgreSQL 支持 4 级别的隔离,并且可以通过设置属性从休眠配置:hibernate.connection.isolation从较低的 1、2、4 或 8水平到最高。

已提交读是 PostgreSQL 中默认的隔离级别,比脏读高一级。

序列化是最高级别并且非常昂贵,因为如果要在同一个表上进行 2 个事务,将会有一个锁,如果锁定发生的时间超过了在数据库/休眠上设置的超时时间,那么它将抛出超时异常。

不确定您是否听说过它们,但以下是可与 hibernate 一起使用以提高性能的框架:

  • C3P0用于更高级的连接池
  • Ehcache通过启用缓存来提高性能

它们易于配置并且不依赖于操作系统。我对 PgPool 没有任何经验,因此无法对性能比较发表评论。

以下是您可能想要尝试的示例休眠设置:

<prop key="hibernate.show_sql">false</prop>
<prop key="hibernate.format_sql">false</prop>
<prop key="hibernate.connection.isolation">4</prop>
<prop key="hibernate.connection.autocommit">false</prop>
<prop key="hibernate.c3p0.min_size">5</prop>
<prop key="hibernate.c3p0.max_size">20</prop>
<prop key="hibernate.c3p0.timeout">1800</prop>
<prop key="hibernate.c3p0.max_statements">50</prop>
<prop key="hibernate.cache.provider_class"> org.hibernate.cache.EhCacheProvider</prop>
<prop key="net.sf.ehcache.configurationResourceName">WEB-INF/ehcache.xml</prop>

我希望这可以帮助您在数据库事务方面优化您的应用程序。您实际上可以检查更多内容,例如表索引,或使用分析器找出哪些事务成本最高。

于 2014-03-30T20:03:52.233 回答
1

业务方法结束时的修改事务如您所描述的那样工作:创建一个 BEGIN/END 块,其中包含所有已提交或回滚的修改查询。

这是通过将 autocommit 设置为 false 来完成的,但这并不意味着 Hibernate 进行的所有查询都在此模式下完成。取决于所需隔离模式的相同查询可以在自动提交或非自动提交模式下执行。

对于处于READ_COMMITED模式下的事务的通常情况,诸如按 Id 查找或命名查询之类的查询将在其自己的数据库事务中运行,并且自动提交为 true(因此没有 BEGIN/END 块)。

REPEATABLE_READFind by Ids 和其他读取查询只有在至少以隔离模式运行时才会触发 BEGIN 块。

这意味着如果您使用默认REPEATABLE_READ隔离模式,负载平衡将正常工作,因为大多数选择查询将在 auto-commit = true 下运行。

您可以通过使用例如log4jdbc记录发送到数据库的所有 SQL 查询来确认这一点。这将打印所有实际发送到数据库的 SQL。

于 2014-03-24T21:07:36.640 回答