JDBC你肯定听过,那JDBC Loadbalance你用过么?

关注我的公众号:【编程朝花夕拾】,可获取首发内容。

01 引言

前一段时间运维团队需要测试数据库连接的负载均衡jdbc loadbalance,但是网上找了一圈没有现成的工具。了解了运维的需求后,我就写了一个小插件,给运维使用。

jdbc loadbalance是一种通过 JDBC(Java Database Connectivity)实现数据库连接负载均衡的技术,旨在将应用程序的数据库请求智能地分配到多个数据库实例(如主从复制集群、读写分离架构等),以提升性能、可用性和可扩展性。

下来给我一起了解一下这款小插件吧

02 插件目标

运维需要一个客户端,能够在客户端上编写SQL 脚本并执行。

目标拆解:

  • 客户端:就是需要编写一个页面
  • 执行SQL:需要连接数据库
  • 客户端与数据的交互:需要一个Web服务支持

03 技术选型

  • 环境:JDK8
  • 生态:SprinBoot
  • 数据库连接工具:jdbc
  • 页面:Thymeleaf
  • 开发工具:Idea

因为是新插件,所以不用考略兼容性问题,所以直接使用SprinBoot方面全家桶开发即可。

04 代码编写

4.1 配置文件

properties 复制代码
# 应用服务 WEB 访问端口
server.port=8080

# 数据库配置链接
# spring.datasource.url = jdbc:mysql://10.100.25.21:3306/test_db?
spring.datasource.url=jdbc:mysql:loadbalance://10.100.25.21:3306,10.100.25.22:3306/test_db?loadBalanceAutoCommitStatementThreshold=5
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.username=root
spring.datasource.password=root

JDBC loadbalance属于JDBC的一部分,专门来支持多数据源的负载均衡的。被注释的部分就是正常的单数据源的连接方式。

4.2 客户端

html 复制代码
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>JDBC-Loadbalanc</title>
    <style>......</style>
</head>
<body>
    <h1>Loadbalance SQL测试</h1>
    <div>
        <label for="sql"></label><textarea id="sql" placeholder="请输入SQL脚本"></textarea>
        <div>
            <button id="excute">执行</button>
            <button id="clear">清空</button>
        </div>
    </div>
    <div>
        <div class="result">执行结果:</div>
        <label for="result"></label><textarea id="result"></textarea>
    </div>
</body>
<script>
    /**
     *  执行
     */
    document.getElementById("excute").onclick = function () {
        document.getElementById("result").value = "";
        let param = document.getElementById("sql").value;
        const encodedData = encodeURIComponent(param);
        fetch("/loadbalance/excute", {
            method: 'post',
            body:`sql=${encodedData}`,
            headers: {
                'Content-Type': 'application/x-www-form-urlencoded'
            },
        })
        .then(res  => { return res.text()})
        .then(data => {{
             document.getElementById("result").value = data;
         }});
    }

    /**
     *  清空
     */
    document.getElementById("clear").onclick = function () {
        document.getElementById("sql").value = "";
        document.getElementById("result").value = "";
        document.getElementById("result").style.height = '200px';
    }
</script>
</html>

Html省略了样式,页面没有引入其他的js插件,浏览器支持的fetch方法发送请求。

4.3 控制层

java 复制代码
/**
 * 插入、更新、删除语句
 *
 * @author ws
 * @date 2025/1/10 17:07
 * @param sql
 * @return {@link int}
 */
@RequestMapping("/excute")
public String excute(String sql){
    if (!StringUtils.hasText(sql)) {
        return "SQL 语句不能为空";
    }

    try {
        sql = sql.trim().toLowerCase();
        if (sql.startsWith("select")) {
            List<Map<String, Object>> maps = jdbcTemplate.queryForList(sql);
            return JSON.toJSONString(maps, JSONWriter.Feature.PrettyFormat);
        }

        int update = jdbcTemplate.update(sql);
        return sql.split(" ")[0] + "语句, 影响行数:" + update + "条记录";
    }catch (Exception e) {
        return "SQL 语句执行失败,请检查: \r\n" + e.getMessage();
    }
}

05 效果展示

06 小结

到这里小插件就开发完了,打成jar包就可以给运维团队使用了。

在使用的过程中,运维团队还希望能够自己修改连接的数据库,这个就需要将配置文件放在外边,暴漏给运维人员,运维人员可以更改想要的数据库连接。

Jar包运行如何下载外部配置文件呢,我们下期讲。

相关推荐
爱看科技9 分钟前
英伟达新架构9B模型引领革命,谷歌/阿里/微美全息AI多维布局锻造底座竞争力
人工智能·架构
bemyrunningdog13 分钟前
Spring文件上传核心技术解析
java
Fireworkitte16 分钟前
Java 系统中实现高性能
java
ningqw18 分钟前
JWT 的使用
java·后端·springboot
追逐时光者39 分钟前
精选 2 款 .NET 开源、实用的缓存框架,帮助开发者更轻松地处理系统缓存!
后端·.net
David爱编程1 小时前
指令重排与内存屏障:并发语义的隐形守护者
java·后端
胡gh2 小时前
数组开会:splice说它要动刀,map说它只想看看。
javascript·后端·面试
Pure_Eyes2 小时前
go 常见面试题
开发语言·后端·golang
ZZHow10242 小时前
Java项目-苍穹外卖_Day1
java·spring boot·web
带刺的坐椅3 小时前
老码农教你 Solon Web Context-Path 的两种配置方式
java·nginx·tomcat·web·solon