Java基于JNDI 实现读写分离的示例代码

针对Java基于JNDI 实现读写分离,我可以为您提供以下攻略。

什么是JNDI?

JNDI(Java Naming and Directory Interface) 是一套用来访问各种命名和目录服务的API,来实现在Java平台上的“访问命名和目录服务”功能。

JNDI的读写分离

JNDI 可以通过配置多个数据源,实现读写分离的场景。对于读请求使用到的数据源进行负载均衡的操作,达到读写分离的效果。

JNDI读写分离的实现步骤

步骤一:配置数据源

<Resource name="jdbc/master" auth="Container"
             type="javax.sql.DataSource" driverClassName="com.mysql.jdbc.Driver"
             url="jdbc:mysql://127.0.0.1:3306/db_master"
             username="root" password="root" maxActive="20" maxIdle="10"
             maxWait="-1"/>

    <!-- 从库1 -->
    <Resource name="jdbc/slave1" auth="Container"
             type="javax.sql.DataSource" driverClassName="com.mysql.jdbc.Driver"
             url="jdbc:mysql://127.0.0.1:3306/db_slave1"
             username="root" password="root" maxActive="20" maxIdle="10"
             maxWait="-1"/>

     <!-- 从库2 -->
    <Resource name="jdbc/slave2" auth="Container"
             type="javax.sql.DataSource" driverClassName="com.mysql.jdbc.Driver"
             url="jdbc:mysql://127.0.0.1:3306/db_slave2"
             username="root" password="root" maxActive="20" maxIdle="10"
             maxWait="-1"/>

在上述配置文件中,我们初始化了3个数据源,其中第一个是主库数据源,后面两个是从库数据源。

步骤二:使用JNDI技术,查找并使用数据源

通过JNDI查找数据源,可以使用如下代码:

InitialContext context=new InitialContext();
DataSource dataSource= (DataSource) context.lookup("java:comp/env/jdbc/master");

其中,context.lookup查找数据源,"java:comp/env/"是固定写法。

步骤三:在连接处做读写分离操作

在连接数据库的时候,我们可以通过判断当前执行的语句类型,进行负载均衡的操作,例子如下:

/**
 * 负载均衡写/读库:INSERT、UPDATE、DELETE都写入master库,SELECT从slave1和slave2均衡获取
 *
 * @return
 * @throws SQLException
 */
public static Connection getConnection() throws SQLException {
    Connection conn = null;
    try {
        if (null == context) {
            context = new InitialContext();
        }
        DataSource dataSource;
        // 根据具体情况做读写分离的实现
        String sql = SQLThreadLocal.get();
        if (StringUtils.containsIgnoreCase(sql, "select")) {
            int index = RandomUtils.nextInt() % 2;
            dataSource = (DataSource) context.lookup(String.format("java:comp/env/jdbc/slave%d", index + 1));
        } else {
            dataSource = (DataSource) context.lookup("java:comp/env/jdbc/master");
        }
        conn = dataSource.getConnection();
    } catch (NamingException e) {
        e.printStackTrace();
    }
    return conn;
}

这里,我们通过 SQLThreadLocal.get() 获取当前执行的SQL语句,如果是SELECT语句,则随机选取最终的数据源;否则使用主库。

注意,JNDI在使用上述方法时,需要保证在 Servlet 容器上下文中才会起作用。如果是普通JAR 包,是没有办法使用JNDI实现读写分离的。

示例代码

你可以在这里看到使用JNDI实现读写分离的 示例代码

此代码包含两个样例,分别是根据不同情况切换数据源和使用AOP动态数据源。你可以自己下载并使用。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Java基于JNDI 实现读写分离的示例代码 - Python技术站

(0)
上一篇 2023年5月31日
下一篇 2023年5月31日

相关文章

  • java操作(DOM、SAX、JDOM、DOM4J)xml方式的四种比较与详解

    Java操作XML方式的四种比较与详解 XML是可扩展标记语言,被广泛应用于各种应用程序中,Java也提供了多种方式来操作XML文档。其中最常见的有DOM、SAX、JDOM、DOM4J。本文将详细解释这四种方式的使用方式和特点。 DOM(Document Object Model) DOM是一种将整个XML文档作为一棵树状结构的方式来处理XML文档。在DOM…

    html 2023年5月30日
    00
  • Php 构造函数construct的前下划线是双的_

    在 PHP 的面向对象编程中,我们经常会用到构造函数__construct()来初始化一个类的实例对象。同时,有时候我们也会看到_ _construct()这样的写法,其中的前下划线是双的_ _。这里提供一个完整的攻略来讲解这个问题。 为什么使用前下划线双的__construct()? 在 PHP 中,前下划线双的__construct()是一个魔术方法(或…

    html 2023年5月30日
    00
  • 实例解析Android中使用Pull解析器解析XML的方法

    实例解析Android中使用Pull解析器解析XML的方法 本篇攻略将为您介绍在Android应用中基于Pull解析器解析XML文件的方法。 Pull解析器是一种基于事件的XML解析方式,它的解析效率较高,且占用内存比DOM解析器更低。跟随下文,您将学习到Pull解析器的实例和使用方式。 准备工作 在你开始引入Pull解析器之前,需要确保已经在Android…

    html 2023年5月30日
    00
  • 在 Vue 中使用 JSX 及使用它的原因浅析

    标题:在 Vue 中使用 JSX 及使用它的原因浅析 什么是JSX JSX是一种JavaScript语法扩展,可以使用类似XML的语法来编写JavaScript代码。 为什么要在Vue中使用JSX 在Vue中使用JSX可以让我们构建组件更加灵活且易于维护,以下是几个原因: 更加灵活的模板结构在使用模板语法我们有一些限制,如只能使用单个根元素包含整个模板,还有…

    html 2023年5月30日
    00
  • JSP语法Page指令

    JSP语法中Page指令用于定义JSP页面的一些特殊属性。 Page指令语法 Page指令必须包含在JSP页面的第一行,其语法格式如下: <%@ page 属性名1="属性值1" 属性名2="属性值2" … %> Page指令的属性值必须用双引号括起来,多个属性以逗号分隔,可以换行书写,但不要在属性值之…

    html 2023年5月30日
    00
  • 实现SQL Server 原生数据从XML生成JSON数据的实例代码

    实现 SQL Server 原生数据从 XML 生成 JSON 数据的实例代码需要经过以下几个步骤: 通过执行以下 T-SQL 语句打开服务器级别的 CLR 集成: sp_configure ‘clr enabled’, 1; GO RECONFIGURE; GO 在 C# 或 VB.NET 编写 CLR 用户定义函数(UDF)将 XML 格式的数据转换为 …

    html 2023年5月30日
    00
  • JSP页面传参出现中文乱码的解决方案

    JSP页面传参中文乱码是一个常见的问题,主要原因是JSP默认使用的编码方式为ISO-8859-1,而中文字符集使用的是UTF-8或GBK等编码方式。在使用中文参数时,需要将编码方式进行转换才能正常显示。 以下是解决方案: 第一步:修改JSP页面编码方式 在JSP页面中加入以下代码,将编码方式设置为UTF-8: <%@ page contentType=…

    html 2023年5月31日
    00
  • 简介C#读取XML的两种方式

    针对“简介C#读取XML的两种方式”这个话题,我可以提供以下完整攻略: 简介C#读取XML的两种方式 XML是一种结构化的数据格式,可以通过c#程序进行读取和解析。下面将介绍两种使用C#读取XML的方式:使用XmlDocument和使用XDocument。 使用XmlDocument方式读取XML XmlDocument是C#中处理XML文档的一种常用方式,…

    html 2023年5月30日
    00
合作推广
合作推广
分享本页
返回顶部