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包运行如何下载外部配置文件呢,我们下期讲。

相关推荐
上进小菜猪1 天前
基于 YOLOv8 的 100 类中药材智能识别实战 [目标检测完整源码]
后端
元Y亨H1 天前
Nacos - 服务发现
java·微服务
微露清风1 天前
系统性学习C++-第十八讲-封装红黑树实现myset与mymap
java·c++·学习
dasi02271 天前
Java趣闻
java
码事漫谈1 天前
AI 技能工程入门:从独立能力到协作生态
后端
码事漫谈1 天前
构建高并发AI服务网关:C++与gRPC的工程实践
后端
阿波罗尼亚1 天前
Tcp SSE Utils
android·java·tcp/ip
susu10830189111 天前
springboot3.5.8整合minio8.5.9
java·springboot
不知道累,只知道类1 天前
深入理解 Java 虚拟线程 (Project Loom)
java·开发语言
myzshare1 天前
实战分享:我是如何用SSM框架开发出一个完整项目的
java·mysql·spring cloud·微信小程序