场景分析:
某天系统的数据库维护方要求进行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).源库恢复后同上
但时间节省了,繁杂的替换文件步骤节省了,出错率减小了.
相关推荐
在IT领域,特别是Java应用服务器环境下,JBoss与MySQL数据库的集成是常见需求之一,而JNDI(Java Naming and Directory Interface)在此过程中扮演着关键角色。本文将深入解析如何在JBoss中配置MySQL的JNDI数据源,...
在Java应用中,JNDI(Java Naming and Directory Interface)是一种标准的接口,它允许应用程序查找和使用资源,如数据源(DataSource),而无需直接在代码中硬编码这些资源的位置或配置信息。JNDI的核心理念是将...
<datasource jndi-name="java:jboss/datasources/MyDB" pool-name="MyDB"> <connection-url>jdbc:mysql://localhost:3306/mydb <driver-class>com.mysql.jdbc.Driver</driver-class> <driver>mysql ...
**JBoss 6.0.0 M4 配置 JNDI 和 Hibernate 深度解析** JBoss 是一个开源的应用服务器,版本6.0.0 M4是它的一个里程碑版本,提供了对Java EE 5规范的支持。在这个版本中,配置JNDI(Java Naming and Directory ...
在EJB+JPA环境中,它通常用于定义数据源(DataSource)的JNDI名称,这样应用就可以通过这个名字找到并连接到数据库。比如,开发者可能会在该文件中设置Oracle数据库的数据源,包括URL、用户名、密码等信息,以便JPA...
<datasource jndi-name="java:jboss/datasources/MySqlDS" pool-name="MySqlDS" enabled="true" use-java-context="true"> <connection-url>jdbc:mysql://localhost:3306/mydb <driver-class>...
<datasource jndi-name="java:jboss/datasources/MySQLDS" pool-name="MySQLDS" enabled="true" use-java-context="true"> <connection-url>jdbc:mysql://localhost:3306/mydatabase?useSSL=false&serverTime...
"在JBoss中配置多个数据库和数据源" 在JBoss中配置多个数据库和数据源是非常复杂的,因为JBoss是一款非常强大的J2EE应用程序服务器。配置多个数据库和数据源需要了解JBoss的配置选项和数据源的配置信息。 首先,...
- 在Java应用服务器(如Tomcat、JBoss、WebLogic等)中,你需要先配置一个JNDI数据源。这通常在服务器的管理控制台或者配置文件(如Tomcat的`context.xml`)中完成。例如,在Tomcat中,可以在`server.xml`或`...
确保`JndiName`与你在`jboss-service.xml`中定义的JNDI名称匹配。 最后,重启JBoss服务器,使更改生效。现在,你的应用程序可以通过在代码中查找`java:jboss/datasources/OracleDS`来获取数据源,并使用JDBC API...
### Java JNDI总结 #### 一、JNDI简介 **JNDI**(Java Naming and Directory Interface)是Java平台中的一个API,用于访问命名和目录服务,这些服务可以存储对象引用及其名称。JNDI的主要作用在于提供了一种在...
在应用服务器(如Tomcat、WebLogic或JBoss)中,我们首先需要在服务器的配置文件(如Tomcat的context.xml或server.xml)中配置DataSource。配置通常包含以下关键部分: 1. 数据库驱动类名:指定与目标数据库兼容的...
然后,需要修改conf/standardjbosscmp-jdbc.xml或jbosscmp-jdbc.xml配置文件,添加datasource和datasource-mapping元素,以便在jboss应用程序中使用oracle数据库。jbosscmp-jdbc.xml配置文件的内容如下所示: ``` ...
在Java应用服务器如Tomcat、WebLogic、JBoss等中,你需要先配置一个JNDI数据源。这通常在服务器的配置文件中完成,比如在Tomcat中,数据源配置在`$CATALINA_HOME/conf/server.xml`的`<Context>`元素内。你需要指定...
在Java EE应用服务器(如Tomcat、JBoss、WebLogic、GlassFish等)中,数据源通常会被配置为一个JNDI资源。开发者无需直接处理数据库连接的创建和关闭,只需通过JNDI查找即可获取连接。 1. **配置数据源**:在应用...
通常,在Web应用程序中,数据源常常通过Java Naming and Directory Interface (JNDI)进行管理,这允许多个应用共享同一个数据源,例如在应用服务器如Tomcat、JBoss或WebLogic中。然而,有时我们可能希望在非Web环境...
- **更新JBOSS配置文件**:修改JBOSS的standardjbosscmp-jdbc.xml文件中的<datasource>元素,以确保JBOSS能够识别并使用之前配置的数据源。 #### 4. **移植注意事项** 在进行TOMCAT到JBOSS的移植过程中,有几个...
<jndi-name>J2YD</jndi-name> <connection-url>jdbc:oracle:thin:@172.20.32.51:1521:YD <driver-class>oracle.jdbc.driver.OracleDriver <user-name>zsyd <password>j2yd <min-pool-size>5 <max-pool-size>...