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