JBOSS 数据源配置并使用JNDI调用

场景分析:

某天系统的数据库维护方要求进行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 ^_^)

时间: 2024-10-08 21:41:57

JBOSS 数据源配置并使用JNDI调用的相关文章

jboss数据源配置

http://blog.csdn.net/clinique/article/details/7482670 最近项目相关的JBOSS配置开始,留下点什么 项目使用的是local-tx-datasource, 网上找了很多资料,都没有明确说明local-tx-datasource和xa-datasource的区别,而且中文的资料太少,去JBOSS Community 查看了一圈找到了有价值的信息. local-tx-datasouce 能不能参与JTA事务 JBOSS Administration

JBOSS EAP 6.2 -EJB远程调用-客户端的配置

EJB访问方式分为远程客户端访问.本地客户端访问和WebService客户端. 所谓的EJB的远程调用是说客户端与服务端的EJB对象不在同一个JVM进程中. 本地客户端是说客户端与服务端的EJB对象在同一个JVM进程中. WebService客户端可以访问无状态会话Bean的接口,只有在业务逻辑方法被标识为@WebMethod的时候,webService客户端才可以访问到. 远程调用 在没有远程调用的时候,我们需要用到别人的数据了,就直接把别人的接口和实现都拿过来了,接着打到自己的包中,这样做一

EJB通过注解方式注入并使用其他EJB或者服务、配置JBoss数据源

通过注解方式注入并使用其他EJB或者服务 真实项目EJB对象很多,EJB之间也可以互相调用, 在项目HelloWorld下新建接口Other在cn.hqu.ejb3下: public interface Other { public abstract String sayMe(); } 新建实现类OtherBean在cn.hqu.ejb3下: public class OtherBean implements Other { @Override public String sayMe() { r

配置JBoss数据源

配置JBoss数据源,为什么要在JBoss中配置数据源?这其实是面向对象思想的一种体现:通过容器管理对数据库的访问. 最开始我们通过JDBC访问数据库,什么Connection.Command都由我们自己创建.但每次打开关闭数据库很消耗资源,于是出现了数据库连接池,提前建立好对数据库的连接,用的时候去连接池取,用完了送回到连接池.这样虽然解决了资源消耗问题,但连接过程仍需要手动干预.后来在用Spring整合Hibernate时,出现了用Spring的IOC容器管理Hibernate对数据库的访问

JBoss下配置数据源加密

一.JBoss下配置数据源时,如果密码直接暴露给了系统的操作员或者维护人员,显然就增加了数据库不安全的因素. MySQL Datasource配置样例 <?xml version="1.0" encoding="UTF-8"?> <!-- ===================================================================== --> <!--                      

EJB配置jboss数据源

1.数据源的模板在\jboss-4.2.3.GA-jdk6\jboss-4.2.3.GA\docs\examples\jca\下2.编辑数据源文件,比如mysql-ds.xml,命名规则是名称-ds.xml结尾3.把数据源文件部署到jboss下,路径是jboss-4.2.3.GA-jdk6\jboss-4.2.3.GA\server\default\deploy\;其中default是配置项,这个路径可以改的,这样就表示数据源配置成功了4.管理数据源路径:http://localhost:808

JNDI数据源配置注意事项

如果是在原有工程上修改 1,applicationContext.xml中修改其中的value值 <bean id="dataSource" class="org.springframework.jndi.JndiObjectFactoryBean"> <property name="jndiName"> <value>java:comp/env/jndivalue</value> </pro

JBOSS数据源加密

1 引言 1.1 编写目的 加强安全管理规范,对用户密码加密. 2 Jboss数据源加密 2.1 生产加密串 1. 生产Jboss密码串 Jboss 服务器执行,生产目录 server 的上一级目录 /home/jboss/jboss-eap-4.3/jboss-as 2. 执行命令,生产加密串,同时修改对应的部署名称,黄色标注 [[email protected] jboss-as]$ java -cp lib/jboss-common.jar:lib/jboss-jmx.jar:server

spring 4 + jpa(hibernate 3/4) + spring mvc 多数据源配置

先从persistence.xml开始: <?xml version=”1.0″ encoding=”UTF-8″?><persistence version=”2.1″ xmlns=”http://java.sun.com/xml/ns/persistence” xmlns:xsi=”http://www.w3.org/2001/XMLSchema-instance” xsi:schemaLocation=”http://java.sun.com/xml/ns/persistence