zoukankan      html  css  js  c++  java
  • JBOSS 数据源配置并使用JNDI调用

    -- 本文出自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加载该驱动:

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

    其中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下;

    注意是所有的节点端,而不是放在控制端就完事,虽然具体的配置文件[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">标签多了如下配置:

    <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会有如下错误:

    说明无法修改.

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

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

  • 相关阅读:
    Add Two Numbers
    Reverse Linked List II
    Reverse Linked List
    Remove Duplicates from Sorted List
    Remove Duplicates from Sorted List II
    Partition List
    Intersection of Two Linked Lists
    4Sum
    3Sum
    2Sum
  • 原文地址:https://www.cnblogs.com/jager/p/4383837.html
Copyright © 2011-2022 走看看