JBoss是一款非常强大的JEE应用程序服务器但是这种强大的功能也带来了复杂性本文作者Marcus Zarra分析了如何在JBoss中配置多个数据库以及数据源
配置数据源
JBoss的默认安装过程总共有三种配置选项所有的(all)默认的(default)和最小的(minimal)如果你第一次启动JBoss服务器的时候没有附带任何参数它自然就运行了默认配置如果需要运行其它的配置就必须使用C参数运行启动脚本如下所示
${JBOSSROOT}/bin/runsh c minimal
用这种方式启动JBoss就指示它使用最小的服务器配置代替默认的配置但是试图改变JBoss自身的配置的时候这种技术是非常有用的你可以在不同的配置中进行修改操作如果有必要就回滚到默认配置可是你在弄混数据源之前应该把默认配置复制一份这样就可以安全地操作该副本了(在本文中我把自己的副本叫作example因此在服务器目录中有四种配置信息所有的默认的最小的和example)
在JBoss中改变默认数据源的第一步是配置一个新数据源JBoss中所有的数据库配置都在你所工作的服务器目录下的deploy目录中定义的(在例子中是server/example/deploy)JBoss使用的默认数据库是纯Java数据库Hypersonic这个数据库的配置信息位于hsqldbdsxml文件中这个XML配置文件描述了如何连接到Hypersonic数据库删除这个文件中的所有注释之后我们得到如下所示的配置信息
<?xml version= encoding=UTF?>
<datasources>
<localtxdatasource>
<jndiname>DefaultDS</jndiname>
<connectionurl>
jdbc:hsqldb:${jbossserverdatadir}${/}hypersonic${/}localDB
</connectionurl>
<driverclass>orghsqldbjdbcDriver</driverclass>
<username>sa</username>
<password></password>
<minpoolsize></minpoolsize>
<maxpoolsize></maxpoolsize>
<idletimeoutminutes></idletimeoutminutes>
<trackstatements/>
<securitydomain>HsqlDbRealm</securitydomain>
<depends>jboss:service=Hypersonicdatabase=localDB</depends>
</localtxdatasource>
<mbean code=orgjbossjdbcHypersonicDatabase name=jboss:service=Hypersonicdatabase=localDB>
<attribute name=Database>localDB</attribute>
<attribute name=InProcessMode>true</attribute>
</mbean>
</datasources>
这些参数中的大多数与JDBC的参数相似根(root)下的第一个部分是<localtxdatasource>这是你定义数据库以及如何连接该数据库的位置驱动程序URL用户名和密码你还定义了连接池中应该有多少个连接
第二步分包含了两个有趣的参数
· <securitydomain>允许你在loginconfigxml文件中而不是在数据源配置信息中配置数据库的用户名和密码
· <depends>指定该服务只有在它所依赖的服务启动后才启动该参数允许你编写数据库应该正确运行的服务<depends>标签还指示JBoss根据需要关闭某些数据项示例中的这个标记表明mbean必须在数据库启动之前启动在数据库关闭之后关闭
在定义好数据源之后服务器的其它部分就可以使用它了希望使用这个数据源的任何其它服务或配置都必须使用JNDI名称来引用它在示例中JNDI名称是DefaultDS
添加另一个数据源
为了给JBoss添加另一个数据源你需要建立一个新的配置文件我希望建立一个数据源它连接到我本机的MySQL数据库并专门使用example数据库为了达到这个目标我建立了一个与前面一个类似的配置文件
<?xml version= encoding=UTF?>
<datasources>
<localtxdatasource>
<jndiname>ExampleDS</jndiname>
<connectionurl>jdbc:mysql://localhost/example</connectionurl>
<driverclass>orggjtmmmysqlDriver</driverclass>
<username>exampleUser</username>
<password>examplePassword</password>
<minpoolsize></minpoolsize>
<maxpoolsize></maxpoolsize>
<idletimeoutminutes></idletimeoutminutes>
<trackstatements/>
</localtxdatasource>
</datasources>
我建立了名为ExampleDS的数据源它通过JDBC使用用户名exampleUser和密码examplePassword连接到一个MySQL数据库我还特别指定连接池最少有个连接最多不超过个连接并且这些连接不能空闲接着我把这个文件存储为deploy目录中的exampledsxml(这个文件的名称并不重要但是名称一致是有好处的)
由于我的新数据源不需要也不依赖于任何其它的模块配置信息中就没有<depends>标签同时由于我在这个文件中指定了使用数据库的用户名和密码我也不需要参照安全域(security domain)
使用新的数据源
现在我希望把JBoss中的一些服务移动到我的新数据源上其原因很简单尽管Hypersonic是一个良好的数据库但是它不应该用于产品环境和/或高容量(hightraffic)系统MySQL和其它几个数据库可以更好地扮演这个角色
Java消息服务
JBoss服务器中使用数据库的一个最常见的部分是消息服务服务器的这部分的容量很大并且应该使用我的新数据源Deploy/jms目录中的下面两个文件定义了消息服务如何使用数据源
· hsqldbjdbcstateservicexml
· hsqldbjdbcservicexml
首先我修改了其中一个文件的名称以突出数据库的类型把hsqldbjdbcstateservicexml 更名为mysqljdbcstateservicexml我对mysqljdbcstateservicexml文件只作了一点点修改<depends>标签应该引用新的ExampleDS数据源而不是默认的DefaultDS这可以确保该数据源在消息服务启动前启动了我还改变了注释信息表明我用MySQL数据库代替了默认的Hypersonic数据库
下一步应该删除并替换hsqldbjdbcservicexml文件由于这个文件定义了消息服务如何使用数据库我们必须在该文件中提供特定数据库的信息幸运的是对于大多数通用的数据库来说JBoss替我们完成了这项工作我从${JBOSSROOT}/doc/examples/jms检索到MySQL特定的文件(mysqljdbcservicexml)并把它放到deploy/jms目录中我只对该文件作了一个很小的修改把数据源的名称改变为ExampleDS与我在数据源配置文件中指定的JNDI名称相匹配
最后为了使消息服务完全转变我把conf/loginconfigxml文件中的DefaultDS改为ExampleDS这个设置告诉JBoss与消息服务相关的登录信息也使用example数据库
调度管理器
如果你要使用JBoss的调度管理器和它的数据库调度程序(scheduler)你也必须指向新的数据源该配置文件位于deploy/schedulemanagerservicexml搜索这个文件中的DefaultDS找到需要重新配置的mbean我把该mbean的DataSourceProperty(数据源属性)指向ExampleDS替代了指向DefaultDS
请注意一定要检查一个SQL语句以确保使用你的数据库工作正常
默认的容器控制(ContainerManaged)持续性
为了改变默认的维持bean(beanpersistence)的数据库你必须更新conf/standardjbosscmpjdbcxml文件把DefaultDS修改为ExampleDS此外你还必须更新<typemapping>标签以匹配新数据库这个标签的值位于该文件中更深入的地方对于本文的例子我把这个值改变为mySQL
你还应该采用相同的方法更新conf/standardjawsxml文件把DefaultDS改变为ExampleDS并更新<typemapping>标签以反映使用的数据库的类型
包装
为了确保所有部分都转换到了新数据源上请删除deploy/hsqldbdsxml文件并启动JBoss如果产生了任何错误就说明你遗漏了某些配置文件
总之我发现使用内建的Hypersonic数据库进行开发比管理外部的数据库带来的痛苦要少一些但是在产品环境中Hypersonic是不适合任务需要的把JBoss连接到更加牢固的数据库对于维护服务器的性能大有帮助