spring学习笔记(18)使用JNDI模拟访问应用服务器多数据源实例

本文涉及的产品
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,高可用系列 2核4GB
简介: <div class="markdown_views"><p>在这一篇文章中,我们要用JNDI访问我们的应用服务器配置好的<strong>多数据源</strong>。在本实例中,我们使用本地的tomcat服务器来模拟远程服务器,由于本地只有mysql数据库,故通过访问不同的mysql数据库不同database来模拟同时访问不同数据库如mysql和oracle等。 <br>下

在这一篇文章中,我们要用JNDI访问我们的应用服务器配置好的多数据源。在本实例中,我们使用本地的tomcat服务器来模拟远程服务器,由于本地只有mysql数据库,故通过访问不同的mysql数据库不同database来模拟同时访问不同数据库如mysql和oracle等。
下面是我们的配置步骤。

1. 在服务器配置全局数据源

首先在我们的tomcat服务器下找到conf文件夹里的server.xml文件,打开并找到 <GlobalNamingResources>。在该节点下会有一个形如下面所示的全局资源

    <Resource auth="Container" description="User database that can be updated and saved" factory="org.apache.catalina.users.MemoryUserDatabaseFactory" name="UserDatabase" pathname="conf/tomcat-users.xml" type="org.apache.catalina.UserDatabase"/>
我们需要在这后面添加我们的数据源配置。如:
    <Resource 
       name="jdbc/mysql1"
       auth="Container" 
       type="javax.sql.DataSource"
       maxActive="100" 
       maxIdle="30" 
       maxWait="10000"
       username="root" 
       password="root"
       driverClassName="com.mysql.jdbc.Driver"
       url="jdbc:mysql://127.0.0.1:3306/yc1"/>
<Resource auth="Container" description="User database that can be updated and saved" factory="org.apache.catalina.users.MemoryUserDatabaseFactory" name="UserDatabase" pathname="conf/tomcat-users.xml" type="org.apache.catalina.UserDatabase"/>
<Resource 
       name="jdbc/mysql2"
       auth="Container" 
       type="javax.sql.DataSource"
       maxActive="100" 
       maxIdle="30" 
       maxWait="10000"
       username="root" 
       password="root"
       driverClassName="com.mysql.jdbc.Driver"
       url="jdbc:mysql://127.0.0.1:3306/yc2"/>

然后需要在存放server.xml的同一个conf目录下找到context.xml,在节点下加入如下示例配置信息

<ResourceLink global="jdbc/mysql1" name="jdbc/mysql1" type="javax.sql.DataSource" />
<ResourceLink global="jdbc/mysql2" name="jdbc/mysql2" type="javax.sql.DataSource" />
注意这里的global要和我们在server.xml中配置的数据源名字一样

2. 在Spring容器中配置JNDI连接池信息

<bean id="dataSource" class="org.springframework.jndi.JndiObjectFactoryBean">  
    <property name="jndiName">  
        <value>java:comp/env/jdbc/mysql1</value>
        <!--java:comp/env是默认部分,
        我们修改jdbc/mysql1对应我们在context.xml中配置<ResourceLink>中的name-->
    </property>  
</bean>
<bean id="dataSource2" class="org.springframework.jndi.JndiObjectFactoryBean">  
    <property name="jndiName">  
        <value>java:comp/env/jdbc/mysql2</value>  
    </property>  
</bean>

在这里我配置两个数据源来模拟连接两个不同的数据库。

3. 测试连接

在本实例中通过Hibernate整合SpringMVC来进行测试。

1. 在IOC容器中配置

<bean id="sessionFactory"
    class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">
    <property name="dataSource">
        <ref bean="dataSource" />
    </property>
    <property name="hibernateProperties">
        <props>
            <!-- MySQL的方言 -->
            <prop key="hibernate.dialect">org.hibernate.dialect.MySQL5Dialect</prop>
            <prop key="javax.persistence.validation.mode">none</prop>
            <!-- 必要时在数据库新建所有表格 -->
            <prop key="hibernate.hbm2ddl.auto">update</prop>
            <prop key="hibernate.show_sql">true</prop>
            <prop key="current_session_context_class">thread</prop>
            <!-- <prop key="hibernate.format_sql">true</prop> -->
        </props>
    </property>
    <property name="packagesToScan" value="com.yc.model1" />
</bean>
<bean id="sessionFactory2"
    class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">
    <property name="dataSource">
        <ref bean="dataSource2" />
    </property>
    <property name="hibernateProperties">
        <props>
            <prop key="hibernate.dialect">org.hibernate.dialect.MySQL5Dialect</prop>
            <prop key="javax.persistence.validation.mode">none</prop>
            <prop key="hibernate.hbm2ddl.auto">update</prop>
            <prop key="hibernate.show_sql">true</prop>
            <prop key="current_session_context_class">thread</prop>
            <prop key="hibernate.format_sql">true</prop>
        </props>
    </property>
    <property name="packagesToScan" value="com.yc.model2" />
</bean>

2. 定义我们的实体类

在这里我们定义两个实体类,对应到两个不同的库表中。

   /*****************实体类1*****************/
   package com.yc.model1;
   @Entity
   public class User {
       @Id
       @GeneratedValue(strategy = GenerationType.AUTO)
       private Integer id;
       private String name;
    //忽略getter和setter
   }
   /*****************实体类2*****************/
   package com.yc.model2;
   @Entity
   public class User {
       @Id
       @GeneratedValue(strategy = GenerationType.AUTO)
       private Integer id;
       private String name;
    //忽略getter和setter
   }

3. 在mysql中创建数据库yc1和yc2:

create database yc1;
create database yc2;

至此,我们的初步测试配置已完成,这时候,运行tomcat服务器,进入mysql数据库,依次执行命令
`use yc1;show tables;use yc2;show tables;`
会看到如下图所示的结果

这里写图片描述
即hibernate帮我们自动对应实体创建表格了。到这里位置,我们的JNDI多数据源配置测试基本完成,但为了使我们的测试更加充分,不妨通过web配置具体测试一遍。

4. 在数据表中插入测试数据

依次执行如下命令:
use yc1;INSERT INTOUser(name) VALUES ('JNDITest1');
use yc2;INSERT INTOUser(name) VALUES ('JNDITest2');

5. 配置Controller

示例如下:

package com.yc.controller;

@Controller
public class JNDITestController {

    @Autowired
    @Qualifier("sessionFactory")
    private SessionFactory sessionFactory;

    @Autowired
    @Qualifier("sessionFactory2")
    private SessionFactory sessionFactory2;
    @RequestMapping("testJNDI")
    @ResponseBody
    public String testJNDI(){
        String name1 = (String) sessionFactory.openSession().createQuery("select name from User where id = 1").uniqueResult();
        String name2 = (String) sessionFactory2.openSession().createQuery("select name from User where id = 1").uniqueResult();
        return "name1 = " + name1 + "————name2 = "+ name2 ;

    }
}

6. 重启tomcat服务器

在游览器中输入如下url:http://localhost:8090/yc/testJNDI,会得到游览器响应:name1 = JNDITest1————name2 = JNDItest2。示例图片如下所示:
这里写图片描述

4. 测试小结

至此我们的配置和测试都已经完成了。这里囿于我的本地资源限制,没有进行远程服务器测试。也没有进行真正的多数据库测试,但原理都是类似的。

上面示例只是为了展示JDNI连接应用服务器配置多数据源的实际操作流程测试。但在实际应用中,面对多数据源,我们还需要针对我们的具体需求作更深入的DAO层设计配置。比如,我们可以结合AOP来针对我们的DAO层的不同访问数据库方法来完成我们的读写分离。具体实现请移步下篇文章。

相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
目录
相关文章
|
10天前
|
存储 缓存 运维
阿里云服务器经济型e与通用算力型u1实例各自性能、适用场景区别及选择参考
在选择阿里云服务器实例规格时,经济型e实例和通用算力型u1实例因其高性价比和广泛适用性,备受个人开发者、中小企业的青睐。在同地域、相同配置的情况下,经济型e和通用算力型u1实例的价格相对于其他实例规格要低一些,很多个人和初创企业用户都会优先考虑选择这两个实例规格的云服务器,那么它们之间有什么区别?各自的性能、适用场景上有何区别?我们应该如何选择呢?本文将详细解析这两款实例的性能特点、适用场景、价格优势及购买建议,帮助用户更好地理解并选择合适的云服务器实例。
|
20天前
|
XML 安全 Java
|
3天前
|
存储 弹性计算 数据挖掘
阿里云服务器ECS经济型e实例与通用算力u1区别、特性优势、使用场景及租赁费用对比
阿里云ECS云服务器的经济型e实例和通用算力型u1实例各有特点。e实例适合个人开发者和小微企业,适用于中小型网站、开发测试和轻量级应用,性价比高。u1实例则更适合中小企业,提供更高的性能和稳定性,适用于企业级应用、数据分析和中小型数据库。同等配置下,u1实例在计算、存储和网络性能上优于e实例。
119 86
|
2天前
|
存储 分布式计算 安全
阿里云服务器经济型、通用算力型、计算型、通用型各主要实例性能、适用场景对比
在阿里云目前的活动中,云服务器实例规格有几大类,分别是轻量应用服务器、经济型e实例、通用算力型u1实例,第七代计算型c7、通用型g7、内存型r7实例,第八代计算型c8i、通用型g8i、内存型r8i实例,倚天云服务器实例计算型c8y、通用型g8y、内存型r8y实例,不同类型的实例规格,性能和适用场景不同,本文将这些热门实例规格的性能和适用场景全部展示出来,以供大家做对比和选择参考,从而选择出适合自己需求的云服务器实例规格。
|
5天前
|
存储 缓存 网络协议
阿里云服务器实例选择:c7/g7/r7和c8i/g8i/r8i及c8y/g8y/r8y实例对比与选择参考
本文将重点介绍阿里云服务器七代云服务器实例(计算型c7、通用型g7、内存型r7)、八代云服务器实例(计算型c8i、通用型g8i、内存型r8i)以及倚天云服务器实例(计算型c8y、通用型g8y、内存型r8y)的主要性能、适用场景及选择参考,帮助用户根据自己的需求选择合适的云服务器实例。
|
3天前
|
存储 缓存 安全
阿里云服务器通用算力型u1实例怎么样?实例性能与测评结果参考
本文将通过性能评测、适用场景、特点介绍、实测数据分享以及最新活动价格等多个方面,全方位解析这款云服务器实例,以供用户了解和参考。
|
13天前
|
弹性计算 数据挖掘 测试技术
ECS e实例测评
ECS e实例是阿里云推出的经济型云服务器,适合中小规模应用。性能上能满足基本需求,但在高并发场景下表现一般。性价比高,价格亲民,适合预算有限的开发者。用户体验良好,配有丰富的技术文档,但部分高级功能操作说明有待优化。
41 18
|
5天前
|
弹性计算 监控 测试技术
ecs e实例测评
阿里云 e实例性能稳定,适用于中小型 Web 应用。在 CPU 和内存性能测试中,e实例表现出色,尤其在资源密集型任务中具有较高的性价比。相比同配置的其他 ECS 规格,e实例在轻量化场景中更为均衡。价格方面,e实例低于传统 ECS 的 t5 实例,且在中国大陆市场具备一定优势。用户体验方面,控制台提供了清晰的实例创建流程和快速部署选项,但缺乏高级应用文档和性能优化指导。总体而言,e实例适合中小型企业和个人开发者使用。
27 5
|
20天前
|
XML Java 数据格式
Spring Core核心类库的功能与应用实践分析
【12月更文挑战第1天】大家好,今天我们来聊聊Spring Core这个强大的核心类库。Spring Core作为Spring框架的基础,提供了控制反转(IOC)和依赖注入(DI)等核心功能,以及企业级功能,如JNDI和定时任务等。通过本文,我们将从概述、功能点、背景、业务点、底层原理等多个方面深入剖析Spring Core,并通过多个Java示例展示其应用实践,同时指出对应实践的优缺点。
43 14
|
19天前
|
存储 分布式计算 安全
阿里云服务器经济型e、通用算力型u1、计算型c8i、通用型g8i、内存型r8i实例介绍与选择参考
在阿里云现在的活动中,可选的云服务器实例规格主要有经济型e、通用算力型u1、计算型c8i、通用型g8i、内存型r8i实例,虽然阿里云在活动中提供了多种不同规格的云服务器实例,以满足不同用户和应用场景的需求。但是有的用户并不清楚他们的性能如何,应该如何选择。本文将详细介绍阿里云服务器中的经济型e、通用算力型u1、计算型c8i、通用型g8i、内存型r8i实例的性能、适用场景及选择参考,帮助用户根据自身需求做出合适的选择。
下一篇
DataWorks