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

相关推荐
一水鉴天5 分钟前
从“AI内在机制探询”到“三重三九格人本主权智能体架构”的演进 之2 20260503 (腾讯元宝)
人工智能·架构
菜鸟的日志8 分钟前
【软件架构风格】面向服务架构(SOA)及其微服务演进
微服务·云原生·架构
一水鉴天10 分钟前
现今/现在/现代——系统设计“现”层架构 20260503 (腾讯元宝)
人工智能·架构
苏三说技术16 分钟前
京东二面:假如SQL中join了10张表,如何优化性能?
后端
测试员周周19 分钟前
【AI测试系统】第5篇:AI 编码工具抛硬币?我们用 LangGraph 做了个“确定性+AI”的测试系统(附自愈架构)
人工智能·python·功能测试·测试工具·架构·langchain·单元测试
dvjr cloi20 分钟前
Spring Framework 中文官方文档
java·后端·spring
研究点啥好呢20 分钟前
滴滴Go后端开发工程师面试题精选:10道高频考题+答案解析
java·开发语言·golang
生成论实验室23 分钟前
《源·觉·知·行·事·物:生成论视域下的统一认知语法》导论:在破碎的世界寻找统一语法
人工智能·科技·算法·架构·创业创新
ictI CABL31 分钟前
SpringBoot3.3.0集成Knife4j4.5.0实战
java
Ruci ALYS32 分钟前
SpringBoot Maven快速上手
spring boot·后端·maven