繁体   English   中英

PgPool Java / JDBC应用程序的负载平衡

[英]PgPool Load balancing for Java/JDBC application

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

如果通过并行模式表示的是事务隔离级别,则从此页面可以看到PostgreSQL支持4级隔离 ,并且可以通过将hibernate.connection.isolation属性设置为1、2、4从hibernate进行配置。或8,从较低级别到最高级别。

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

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

不知道您是否听说过它们,但是以下是可与休眠一起使用以提高性能的框架:

  • 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>

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

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

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

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

如果按ID查找和其他读取查询至少以REPEATABLE_READ隔离模式运行,则只会触发BEGIN块。

这意味着,如果您使用默认的REPEATABLE_READ隔离模式,则由于大多数选择查询将以auto-commit = true运行,因此负载平衡将正常运行。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM