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

摘要:
--本文来自睡眠的场景分析(感谢yangjj^_^):一天,系统的数据库维护方请求对DG备用数据库进行灾难恢复演练。有必要模拟RAC数据库的生产停机时间,并将其转移到DG备用数据库。由于这是一次故障转移演练而不是切换演练,因此在此期间,Apache访问未向公众开放,服务启动时间要求很短。数据库切换导致IP更改,这导致AP上运行的系统必须重新配置数据库连接。根据当前机制,需要执行以下步骤:a)。停止服务组b)

-- 本文出自sleest (感谢yangjj ^_^)

场景分析:

某天系统的数据库维护方要求进行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加载该驱动:

建立如下图所示的目录结构: 

JBOSS 数据源配置并使用JNDI调用第1张

其中module.xml的内容如下:

<?xml version="1.0" encoding="UTF-8"?>
<module xmlns="urn:jboss:module:1.0" name="com.oracle">
    <resources>
        <!-- Insert resources here -->
        <resource-root path="ojdbc6.jar"/>
    </resources>
    <dependencies>
        <module name="javax.api"/>
        <module name="javax.transaction.api"/>
    </dependencies>
</module>

(扯淡:由于jboss6 使用了类maven的结构化管理,即不想4那样jar基本都在一个lib目录下,而是通过module的概念引入,并且module之间允许规定依赖和排除,也可以全局配置module引入和服务包中jar的优先级,当然最麻烦的是hibernate冲突,因为那是用石头砸自己脚)

3.把这个目录放到结点端 $JBOSS_HOME/modules下;

JBOSS 数据源配置并使用JNDI调用第2张

注意是所有的节点端,而不是放在控制端就完事,虽然具体的配置文件[domain.xml]是在控制端配的,要不在启动服务时,注册datasource就会失败:

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

    ("subsystem" => "datasources"),

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

4.启动jboss控制端,并在其控制台进行相关配置:

JBOSS 数据源配置并使用JNDI调用第3张

[1].进入profiles选项

[2].选择对应的配置文件,这里的profile和你对应群组指定的profile相对应,这里用的是domain下full-ha模式,目前没有尝试过full-ha工程的JNDI指向full配置的datasource,这也是为什么经常在改domain.xml的时候遇到很多相同的配置,实际是jboss划分了不同的配置域:

JBOSS 数据源配置并使用JNDI调用第4张
JBOSS 数据源配置并使用JNDI调用第5张

[3].Datasources选项卡

[4].add按钮弹出新增页面(这里奉劝先别删默认的example配置-  -)

5.配置数据源别名和JNDI

JBOSS 数据源配置并使用JNDI调用第6张

6.Detected Driver是只读,给你看的

JBOSS 数据源配置并使用JNDI调用第7张
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.配置数据库链接: 

JBOSS 数据源配置并使用JNDI调用第8张
8.完成后默认是disable状态,具体的配置可以在其下的属性框中进行相应调整,这里的xxx是driver的别名,在具体的xml中会指向一个具体的class

JBOSS 数据源配置并使用JNDI调用第9张

比较特殊的属性在pool标签中通过键值对配置

9.保存后可以在domain.xml中找到profile name="full-ha"下的<subsystem xmlns="urn:jboss:domain:datasources:1.1">标签多了如下配置:

<datasource jta="true" jndi-name="java:jboss/datasources/oracleRacDS" pool-name="oracleRacDS" enabled="false" use-ccm="false" use-java-context="true">
    <connection-url>[jdbc连接]</connection-url>
    <driver-class>com.oracle.jdbc.driver.OracleDriver</driver-class>
    <datasource-class>com.oracle</datasource-class>
    <driver>[别名A]</driver>
    <pool>
        <min-pool-size>10</min-pool-size>
        <max-pool-size>30</max-pool-size>
    </pool>
    <security>
        <user-name>[用户名]</user-name>
        <password>[密码]</password>
    </security>
    <validation>
        <validate-on-match>false</validate-on-match>
        <background-validation>false</background-validation>
    </validation>
    <timeout>
        <idle-timeout-minutes>60</idle-timeout-minutes>
    </timeout>
    <statement>
        <share-prepared-statements>false</share-prepared-statements>
    </statement>
</datasource>
<drivers>
    <driver name="[别名A]" module="com.oracle">
        <xa-datasource-class>oracle.jdbc.xa.OracleXADataSource</xa-datasource-class>
    </driver>
</drivers>
</datasources>

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

10.最后重启控制端JBOSS再enable该数据源即可生效(服务端可以不用重启).

11.服务包中的datasource配置改为JNDI调用即可:

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

12.重新部署服务包,启动群组时,在节点段的日志中看到如下信息即说明注册成功

[org.jboss.as.connector.subsystems.datasources] (MSC service thread 1-18) JBAS010400: 绑定数据源 [java:jboss/datasources/oracleRacDS]

实践:

群组启动完成后服务端可以从数据库读取数据.

这是修改正enable状态的datasource会有如下错误:

JBOSS 数据源配置并使用JNDI调用第10张

说明无法修改.

此时如果将改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).源库恢复后同上

但时间节省了,繁杂的替换文件步骤节省了,出错率减小了. 

免责声明:文章转载自《JBOSS 数据源配置并使用JNDI调用》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇Threejs的学习 2、点,线,面【转】Hive的insert操作下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

在平台中使用JNDI 数据源

有些情况下为了系统的安全性考虑,可以将数据源配置成JNDI,在程序中只需要使用 容器的JNDI路径就可以了。 配置方法 1.在容器中配置数据源 <Context path="/" docBase="E:work edxunhunanjdsrcmainwebapp" > <Resource name="jdbc/...

应用部署到JBOSS上遇到的问题

原来应用在WAS7.0下,移植到JBOSS eap5.1.2下后,遇到了一些问题,特此记录: 1、数据源配置 在was中,datasource中获取数据源名称时,直接写was中配置的数据源名称即可。而在jboss下,jndi的名称需要以java:+数据源名称开始。was下可以通过console去配置数据源,jboss中,将数据库驱动复制到%JBOSS_HO...

使用Maven构建和部署J2EE应用程序的EAR文件

这篇文章。主要是技术上的整理,用来mark一下,用的时候參考。 一、新建项目 新建一个空的Maven Project项目 二、放入依赖 注:ear部署时假设里面有entity,会错误发生。所以不要把entity放到依赖项中。部署的时候先部实体,然后再部ear。 将须要打入EAR中的jar、war以dependencies-depend...

JBOSS目录结构详细说明

一、下载与安装。 如何下载以及安装配置,请参考:Windows下JBOSS安装配置图文教程 二、现在主要了解一下JBOSS目录结构。 1. 主目录: E:jboosjboss-6.1.0.Final bin 开始和停止JBoss的地方。 其中有两个主要的批处理文件:run.bat和shutdown.bat。要启动JBoss只要执行run.bat文件即可;...

Jboss

是一个基于J2EE的开放源代码的应用服务器。 JBoss代码遵循LGPL许可,可以在任何商业应用中免费使用,而不用支付费用。JBoss是一个管理EJB的容器和服务器,支持EJB 1.1、EJB 2.0和EJB3的规范。但JBoss核心服务不包括支持servlet/JSP的WEB容器,一般与Tomcat或Jetty绑定使用。 产品特点 编辑 在J2EE应...

Jboss安装

(1)Jboss下载:http://jbossas.jboss.org/downloads/ 选择需要的版本下载即可,Jboss可以直接解压缩,就能运行。前提是需要Java环境,需要安装jdk。 (2)Jdk下载:http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-...