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

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