配置數據源
JBoss的默認安裝過程總共有三種配置選項:所有的(all)、默認的(default)和最小的(minimal)。如果你第一次啟動JBoss服務器的時候沒有附帶任何參數,它自然就運行了默認配置。如果需要運行其它的配置,就必須使用-C參數運行啟動腳本,如下所示:
${JBOSS.ROOT}/bin/run.sh -c minimal
用這種方式啟動JBoss就指示它使用最小的服務器配置代替默認的配置。但是試圖改變JBoss自身的配置的時候,這種技術是非常有用的。你可以在不同的配置中進行修改操作,如果有必要就回滾到默認配置。可是,你在弄混數據源之前,應該把默認配置復制一份,這樣就可以安全地操作該副本了(在本文中,我把自己的副本叫作example,因此在服務器目錄中有四種配置信息:所有的、默認的、最小的和example)。
在JBoss中改變默認數據源的第一步是配置一個新數據源。JBoss中所有的數據庫配置都在你所工作的服務器目錄下的deploy目錄中定義的(在例子中是server/example/deploy)。JBoss使用的默認數據庫是純Java數據庫Hypersonic。這個數據庫的配置信息位于hsqldb-ds.xml文件中。這個XML配置文件描述了如何連接到Hypersonic數據庫。刪除這個文件中的所有注釋之后,我們得到如下所示的配置信息:
<?xml version="1.0" encoding="UTF-8"?> <datasources> <local-tx-datasource> <jndi-name>DefaultDS</jndi-name> <connection-url> jdbc:hsqldb:${jboss.server.data.dir}${/}hypersonic${/}localDB </connection-url> <driver-class>org.hsqldb.jdbcDriver</driver-class> <user-name>sa</user-name> <password></password> <min-pool-size>5</min-pool-size> <max-pool-size>20</max-pool-size> <idle-timeout-minutes>0</idle-timeout-minutes> <track-statements/> <security-domain>HsqlDbRealm</security-domain> <depends>jboss:service=Hypersonic,database=localDB</depends> </local-tx-datasource> <mbean code="org.jboss.jdbc.HypersonicDatabase" name="jboss:service=Hypersonic,database=localDB"> <attribute name="Database">localDB</attribute> <attribute name="InProcessMode">true</attribute> </mbean> </datasources> |
這些參數中的大多數與JDBC的參數相似。根(root)下的第一個部分是<local-tx-datasource>。這是你定義數據庫以及如何連接該數據庫的位置:驅動程序、URL、用戶名和密碼。你還定義了連接池中應該有多少個連接。
第二步分包含了兩個有趣的參數:
· <security-domain>允許你在login-config.xml文件中而不是在數據源配置信息中配置數據庫的用戶名和密碼。
· <depends>指定該服務只有在它所依賴的服務啟動后才啟動。該參數允許你編寫數據庫應該正確運行的服務。<depends>標簽還指示JBoss根據需要關閉某些數據項。示例中的這個標記表明mbean必須在數據庫啟動之前啟動,在數據庫關閉之后關閉。
在定義好數據源之后,服務器的其它部分就可以使用它了。希望使用這個數據源的任何其它服務或配置都必須使用JNDI名稱來引用它。在示例中,JNDI名稱是DefaultDS。
添加另一個數據源
為了給JBoss添加另一個數據源,你需要建立一個新的配置文件。我希望建立一個數據源,它連接到我本機的MySQL數據庫,并專門使用example數據庫。為了達到這個目標,我建立了一個與前面一個類似的配置文件:
<?xml version="1.0" encoding="UTF-8"?> <datasources> <local-tx-datasource> <jndi-name>ExampleDS</jndi-name> <connection-url>jdbc:mysql://localhost/example</connection-url> <driver-class>org.gjt.mm.mysql.Driver</driver-class> <user-name>exampleUser</user-name> <password>examplePassword</password> <min-pool-size>5</min-pool-size> <max-pool-size>20</max-pool-size> <idle-timeout-minutes>0</idle-timeout-minutes> <track-statements/> </local-tx-datasource> </datasources> |
我建立了名為ExampleDS的數據源,它通過JDBC,使用用戶名exampleUser和密碼examplePassword連接到一個MySQL數據庫。我還特別指定連接池最少有5個連接,最多不超過20個連接,并且這些連接不能空閑。接著我把這個文件存儲為deploy目錄中的example-ds.xml(這個文件的名稱并不重要,但是名稱一致是有好處的)。
由于我的新數據源不需要、也不依賴于任何其它的模塊,配置信息中就沒有<depends>標簽。同時,由于我在這個文件中指定了使用數據庫的用戶名和密碼,我也不需要參照安全域(security domain)。
使用新的數據源
現在我希望把JBoss中的一些服務移動到我的新數據源上。其原因很簡單:盡管Hypersonic是一個良好的數據庫,但是它不應該用于產品環境和/或高容量(high-traffic)系統;MySQL和其它幾個數據庫可以更好地扮演這個角色。
Java消息服務
JBoss服務器中使用數據庫的一個最常見的部分是消息服務。服務器的這部分的容量很大,并且應該使用我的新數據源。Deploy/jms目錄中的下面兩個文件定義了消息服務如何使用數據源:
· hsqldb-jdbc-state-service.xml
· hsqldb-jdbc2-service.xml
首先,我修改了其中一個文件的名稱以突出數據庫的類型:把hsqldb-jdbc-state-service.xml 更名為mysql-jdbc-state-service.xml。我對mysql-jdbc-state-service.xml文件只作了一點點修改:<depends>標簽應該引用新的ExampleDS數據源而不是默認的DefaultDS。這可以確保該數據源在消息服務啟動前啟動了。我還改變了注釋信息,表明我用MySQL數據庫代替了默認的Hypersonic數據庫。
下一步,應該刪除并替換hsqldb-jdbc2-service.xml文件。由于這個文件定義了消息服務如何使用數據庫,我們必須在該文件中提供特定數據庫的信息。幸運的是,對于大多數通用的數據庫來說,JBoss替我們完成了這項工作。我從${JBOSS.ROOT}/doc/examples/jms檢索到MySQL特定的文件(mysql-jdbc2-service.xml),并把它放到deploy/jms目錄中。我只對該文件作了一個很小的修改,把數據源的名稱改變為ExampleDS,與我在數據源配置文件中指定的JNDI名稱相匹配。
最后,為了使消息服務完全轉變,我把conf/login-config.xml文件中的DefaultDS改為ExampleDS。這個設置告訴JBoss,與消息服務相關的登錄信息也使用example數據庫。
調度管理器
如果你要使用JBoss的調度管理器和它的數據庫調度程序(scheduler),你也必須指向新的數據源。該配置文件位于deploy/schedule-manager-service.xml。搜索這個文件中的DefaultDS,找到需要重新配置的mbean,我把該mbean的DataSourceProperty(數據源屬性)指向ExampleDS,替代了指向DefaultDS。
請注意,一定要檢查一個SQL語句,以確保使用你的數據庫工作正常。
默認的容器控制(Container-Managed)持續性
為了改變默認的維持bean(bean-persistence)的數據庫,你必須更新conf/standardjbosscmp-jdbc.xml文件,把DefaultDS修改為ExampleDS。此外,你還必須更新<type-mapping>標簽以匹配新數據庫;這個標簽的值位于該文件中更深入的地方。對于本文的例子,我把這個值改變為mySQL。
你還應該采用相同的方法更新conf/standardjaws.xml文件:把DefaultDS改變為ExampleDS,并更新<type-mapping>標簽,以反映使用的數據庫的類型。
包裝
為了確保所有部分都轉換到了新數據源上,請刪除deploy/hsqldb-ds.xml文件并啟動JBoss。如果產生了任何錯誤,就說明你遺漏了某些配置文件。
總之,我發現使用內建的Hypersonic數據庫進行開發比管理外部的數據庫帶來的痛苦要少一些。但是在產品環境中,Hypersonic是不適合任務需要的。把JBoss連接到更加牢固的數據庫對于維護服務器的性能大有幫助。