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 配置文件

# 应用服务 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 客户端

<!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 控制层

/**
 * 插入、更新、删除语句
 *
 * @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包运行如何下载外部配置文件呢,我们下期讲。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

智_永无止境

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值