簡體   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