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日

相关文章

  • Jquery乱码的一次解决过程 图解教程

    下面是针对“Jquery乱码的一次解决过程 图解教程”的完整攻略。 问题描述 在使用jQuery的ajax方法请求服务器返回的中文数据时,经常会出现乱码现象。这个问题在我们日常开发中经常遇到。 乱码原因 这种问题的出现是因为后端服务器返回的结果是GBK编码格式,而前端页面使用的是UTF-8编码格式。这样就会导致中文显示为乱码。 解决方案 方案一:后端进行编码…

    html 2023年5月31日
    00
  • html5 input属性使用示例

    HTML5为我们带来了很多新的表单属性,这里将会分享一些常见的input属性使用示例,并且演示如何使用这些属性。 1. placeholder属性 这个属性定义一个控件的预期值的一个提示文本,即控件的内容/值的预期格式或值,但不必是尖括号、括号之类的限定符或完整的文本格式。实现方式如下: <input type="text" pla…

    html 2023年5月30日
    00
  • 解决JavaEE开发中字符编码出现乱码的问题

    JavaEE开发中出现乱码的问题往往与字符编码有关。下面是解决JavaEE开发中字符编码出现乱码的问题的完整攻略。 1. 设置项目字符编码 在编写JavaEE应用程序时,我们需要设置项目的字符编码。例如,在SpringBoot中,我们可以在application.properties文件中添加以下属性: # 设置字符编码为UTF-8 spring.http.…

    html 2023年5月31日
    00
  • Android中复制图片的实例代码

    请你先阅读以下完整的攻略: Android中复制图片的实例代码 在Android中,我们可以使用系统剪贴板来复制图片,这里提供一份Android中复制图片的实例代码。 步骤1:添加复制图片权限 在AndroidManifest.xml文件中添加以下权限: <uses-permission android:name="android.permi…

    html 2023年5月31日
    00
  • 最容易犯的HTML标签错误写法

    当编写HTML代码时,可能会犯一些常见的标签错误写法。这些错误可能会导致网站在不同的浏览器中显示出不同的结果,并且可能会影响网站的可访问性和可用性。以下是一些最容易犯的HTML标签错误写法以及如何避免这些错误的攻略。 1.未关闭标签 在HTML中,每个开始标签必须有对应的结束标签。未关闭标签是指开始标签没有相应的结束标签。这可能会导致网站出现意想不到的结果。…

    html 2023年5月30日
    00
  • OpenXml合并Table单元格代码实例

    当我们需要对Word文档进行排版时,Table表格是一个非常重要的排版工具。有时候我们需要合并Table表格中的单元格,以满足各种排版要求。OpenXml提供了一些API,可以方便地合并Table表格中的单元格,本篇文章将详细讲解如何实现OpenXml合并Table单元格。 1.准备工作 在开始使用OpenXml进行Table单元格合并之前,需要了解Open…

    html 2023年5月30日
    00
  • 浅析Spring基于注解的AOP

    浅析Spring基于注解的AOP 什么是AOP AOP(Aspect Oriented Programming),面向切面编程,通过预编译方式和运行时动态代理实现在不修改原有业务代码的情况下,对系统功能进行增强。 在AOP中,切面是指一类横跨多个对象的特定行为,比如事务管理、日志管理等。切面可以包含前置、后置、环绕、异常通知等多个通知,对目标对象的方法进行增…

    html 2023年5月30日
    00
  • String与XML互转以及从XML取节点值并修改的方法

    下面是关于String与XML互转以及从XML取节点值并修改的方法的完整攻略。 String与XML互转 String转XML 我们可以使用Java自带的DOM解析器或第三方库比如jsoup来实现String转XML。 DOM解析器实现 String xmlStr = "<root>Hello World!</root>&q…

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