[英]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个事务,则会有一个锁,如果锁发生的时间超过了数据库/休眠设置的超时时间,那么它将抛出超时异常。
不知道您是否听说过它们,但是以下是可与休眠一起使用以提高性能的框架:
它们易于配置,并且不依赖于操作系统。 我没有使用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.