JBOSS 資料來源配置並使用JNDI調用

來源:互聯網
上載者:User

標籤:

情境分析:

某天系統的資料庫維護方要求進行DG備庫容災演練,要把生產用RAC庫類比宕機並轉移至DG備庫上,由於是failover而不是switchover演練,於是期間不對外開放apache訪問,要求服務啟動時間較緊.

資料庫的切換導致IP的變更,這樣導致ap上正在跑的系統不得不重新設定資料庫連接,基於目前的機制需要執行以下步驟:

  a).停止服務群組

  b).移除服務包

  c).源服務包替換設定檔(這樣還要求服務包的目前的版本備份完好)

  d).重新上傳服務包

  e).分發至群組,最後啟動群組

  f).當源庫恢複正常時又得來一遍T  T

這樣處理顯然比DG庫改IP花費更高,雖然DG要改相應監聽等操作,但據瞭解可以通過命令列即批處理減少每次的工作量.

於是引申如何在DB出現異常時服務快速恢複的問題

分析:

1.時間花費主要用在了重新部署服務包上,如何省略這個步驟,簡單想有兩個方案

  a).重寫使用資料來源初始化串連池的方案

  b).使用容器管理的資料源,服務包通過JNDI進行請求

其中a方案否決,一不通用,二重寫的話後面出問題又要重寫人負責=  =

因此使用容器管理的資料源的方案.

環境:

JBOSS EAP 6 domain叢集

服務使用spring管理

資料庫oracle 11g

解決方案:

1.暫訂使用ojdbc作為驅動,因此首先要有個ojdbc6.jar,傳說其他版本可能會有部分問題,如14不相容jdk1.6,_gz不支援11g等

2.讓jboss載入該驅動:

建立如所示的目錄結構: 

其中module.xml的內容如下:

Xml代碼

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <module xmlns="urn:jboss:module:1.0" name="com.oracle">
  3. <resources>
  4. <!-- Insert resources here -->
  5. <resource-root path="ojdbc6.jar"/>
  6. </resources>
  7. <dependencies>
  8. <module name="javax.api"/>
  9. <module name="javax.transaction.api"/>
  10. </dependencies>
  11. </module>

(扯淡:由於jboss6 使用了類maven的結構化管理,即不想4那樣jar基本都在一個lib目錄下,而是通過module的概念引入,並且module之間允許規定依賴和排除,也可以全域配置module引入和服務包中jar的優先順序,當然最麻煩的是hibernate衝突,因為那是用石頭砸自己腳)

3.把這個目錄放到結點端 $JBOSS_HOME/modules下;

注意是所有的節點端,而不是放在控制端就完事,雖然具體的設定檔[domain.xml]是在控制端配的,要不在啟動服務時,註冊datasource就會失敗:

[org.jboss.as.controller.management-operation] (ServerService Thread Pool -- 59) JBAS014613: 操作("add") 失敗 -- 地址:([

    ("subsystem" => "datasources"),

    ("jdbc-driver" => "xxx.war")

4.啟動jboss控制端,並在其控制台進行相關配置:

[1].進入profiles選項

[2].選擇對應的設定檔,這裡的profile和你對應群組指定的profile相對應,這裡用的是domain下full-ha模式,目前沒有嘗試過full-ha工程的JNDI指向full配置的datasource,這也是為什麼經常在改domain.xml的時候遇到很多相同的配置,實際是jboss劃分了不同的佈建網域:


[3].Datasources選項卡

[4].add按鈕彈出新增頁面(這裡奉勸先別刪預設的example配置-  -)

5.配置資料來源別名和JNDI

6.Detected Driver是唯讀,給你看的


Specify Driver我在添加的時候報錯:

Internal Server Error

{

    "outcome" => "failed",

    "result" => undefined,

    "failure-description" => "JBAS010839: 操作失敗或在所有伺服器上復原。",

    "rolled-back" => true,

    "server-groups" => {"main-server-group" => {"host" => {"slave1" => {"main-server33" => {"response" => {

        "outcome" => "failed",

        "result" => undefined,

        "failure-description" => {"JBAS014771: 具有丟失/不可用依賴關係的服務" => ["jboss.driver-demander.java:jboss/datasources/oracleRacDS1 缺少 [jboss.jdbc-driver.xxxDs]"]},

        "rolled-back" => true

    }}}}}}

}

即這裡似乎指定了jboss.jdbc-driver.的首碼,暫未瞭解何處指定;

7.設定資料庫連結: 


8.完成後預設是disable狀態,具體的配置可以在其下的屬性框中進行相應調整,這裡的xxx是driver的別名,在具體的xml中會指向一個具體的class

比較特殊的屬性在pool標籤中通過索引值對配置

9.儲存後可以在domain.xml中找到profile name="full-ha"下的<subsystem xmlns="urn:jboss:domain:datasources:1.1">標籤

多了如下配置,

Xml代碼

  1. <datasource jta="true" jndi-name="java:jboss/datasources/oracleRacDS" pool-name="oracleRacDS" enabled="false" use-ccm="false" use-java-context="true">
  2. <connection-url>[jdbc串連]</connection-url>
  3. <driver-class>com.oracle.jdbc.driver.OracleDriver</driver-class>
  4. <datasource-class>com.oracle</datasource-class>
  5. <driver>[別名A]</driver>
  6. <pool>
  7. <min-pool-size>10</min-pool-size>
  8. <max-pool-size>30</max-pool-size>
  9. </pool>
  10. <security>
  11. <user-name>[使用者名稱]</user-name>
  12. <password>[密碼]</password>
  13. </security>
  14. <validation>
  15. <validate-on-match>false</validate-on-match>
  16. <background-validation>false</background-validation>
  17. </validation>
  18. <timeout>
  19. <idle-timeout-minutes>60</idle-timeout-minutes>
  20. </timeout>
  21. <statement>
  22. <share-prepared-statements>false</share-prepared-statements>
  23. </statement>
  24. </datasource>
  25. <drivers>
  26. <driver name="[別名A]" module="com.oracle">
  27. <xa-datasource-class>oracle.jdbc.xa.OracleXADataSource</xa-datasource-class>
  28. </driver>
  29. </drivers>
  30. </datasources>

其中仍需修改xa-datasource-class為如上紅色部分.

10.最後重啟控制端JBOSS再enable該資料來源即可生效(服務端可以不用重啟).

11.服務包中的datasource配置改為JNDI調用即可:

Xml代碼

  1. <bean id="dataSource" class="org.springframework.jndi.JndiObjectFactoryBean">
  2. <property name="jndiName">
  3. <value>java:jboss/datasources/oracleRacDS</value>
  4. </property>
  5. </bean>

12.重新部署服務包,啟動群組時,在節點段的日誌中看到如下資訊即說明註冊成功

[org.jboss.as.connector.subsystems.datasources] (MSC service thread 1-18) JBAS010400: 綁定資料來源 [java:jboss/datasources/oracleRacDS]

實踐:

群組啟動完成後服務端可以從資料庫讀取資料.

這是修改正enable狀態的datasource會有如下錯誤:

說明無法修改.

此時如果將改datasource disable掉

服務端日誌中將會出現如下異常:

javax.resource.ResourceException: IJ000451: The connection manager is shutdown: java:jboss/datasources/oracleRacDS

此時再enable也無法重連該串連;

結論:

通過使用JNDI指向jboss資料來源的方式,可以將資料庫調整時服務段所做的調整降為如下步驟:

a).停止服務群組

b).移除服務包

c).源服務包替換設定檔(這樣還要求服務包的目前的版本備份完好)

d).重新上傳服務包

e).分發至群組,最後啟動群組

f).當源庫恢複正常時又得來一遍T  T

b).disable資料來源

c).修改資料來源配置儲存並enable

d).啟動服務群組即可

e).源庫恢複後同上

但時間節省了,繁雜的替換檔案步驟節省了,出錯率減小了. 

 

--出自sleest (感謝yangjj ^_^)

JBOSS 資料來源配置並使用JNDI調用

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.