手搓一个不用中间件的分表策略

场景:针对一些特别的项目,不用中间件,以月为维度进行分表,代码详细设计方案

1. 定义分片策略

首先,定义一个分片策略类,用于决定数据存储在哪个分表中

import java.time.LocalDate;
import java.time.format.DateTimeFormatter;public class ShardingStrategy {private static final DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy_MM");public String getShardId(LocalDate date) {return date.format(formatter);}
}

2. 数据库连接管理

创建一个数据库连接管理类,用于管理数据库连接

import java.sql.Connection;
import java.sql.DriverManager;public class DatabaseManager {private static Connection connection;static {try {Class.forName("com.mysql.cj.jdbc.Driver");connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/mydatabase", "user", "password");} catch (Exception e) {e.printStackTrace();}}public static Connection getConnection() {return connection;}
}

3. 动态创建表

创建一个方法,用于根据当前月份动态创建新的表

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.time.LocalDate;public class TableCreator {private ShardingStrategy shardingStrategy = new ShardingStrategy();public void createTableForMonth(LocalDate date) {String shardId = shardingStrategy.getShardId(date);String tableName = "orders_" + shardId;Connection connection = DatabaseManager.getConnection();String createTableSQL = "CREATE TABLE IF NOT EXISTS " + tableName + " ("+ "id BIGINT PRIMARY KEY,"+ "order_date DATE,"+ "customer_name VARCHAR(255)"+ ")";try (PreparedStatement statement = connection.prepareStatement(createTableSQL)) {statement.execute();System.out.println("Table " + tableName + " created successfully.");} catch (SQLException e) {e.printStackTrace();}}
}

4. 订单操作类

创建一个订单操作类,用于执行具体的数据库操作。这里根据分片策略动态生成表名

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.time.LocalDate;public class OrderDAO {private ShardingStrategy shardingStrategy = new ShardingStrategy();private TableCreator tableCreator = new TableCreator();public void createOrder(long orderId, LocalDate orderDate, String customerName) {// 确保表存在tableCreator.createTableForMonth(orderDate);String shardId = shardingStrategy.getShardId(orderDate);String tableName = "orders_" + shardId;Connection connection = DatabaseManager.getConnection();try (PreparedStatement statement = connection.prepareStatement("INSERT INTO " + tableName + " (id, order_date, customer_name) VALUES (?, ?, ?)")) {statement.setLong(1, orderId);statement.setDate(2, java.sql.Date.valueOf(orderDate));statement.setString(3, customerName);statement.executeUpdate();} catch (SQLException e) {e.printStackTrace();}}public String getCustomerNameByOrderId(long orderId, LocalDate orderDate) {String shardId = shardingStrategy.getShardId(orderDate);String tableName = "orders_" + shardId;Connection connection = DatabaseManager.getConnection();try (PreparedStatement statement = connection.prepareStatement("SELECT customer_name FROM " + tableName + " WHERE id = ?")) {statement.setLong(1, orderId);ResultSet resultSet = statement.executeQuery();if (resultSet.next()) {return resultSet.getString("customer_name");}} catch (SQLException e) {e.printStackTrace();}return null;}
}

5. 使用示例

最后,展示如何使用上述类来创建订单和查询订单信息

public class Main {public static void main(String[] args) {OrderDAO orderDAO = new OrderDAO();// 创建订单orderDAO.createOrder(1, LocalDate.of(2023, 1, 15), "Alice");orderDAO.createOrder(2, LocalDate.of(2023, 2, 20), "Bob");orderDAO.createOrder(3, LocalDate.of(2023, 3, 10), "Charlie");// 查询订单System.out.println("Order ID 1: " + orderDAO.getCustomerNameByOrderId(1, LocalDate.of(2023, 1, 15)));System.out.println("Order ID 2: " + orderDAO.getCustomerNameByOrderId(2, LocalDate.of(2023, 2, 20)));System.out.println("Order ID 3: " + orderDAO.getCustomerNameByOrderId(3, LocalDate.of(2023, 3, 10)));}
}

总结

  • 分片策略:根据订单日期决定数据存储在哪个分表中。
  • 数据库连接管理:管理数据库连接,所有分表都在同一个数据库中。
  • 动态创建表:根据当前月份动态创建新的表。
  • 订单操作:执行具体的数据库操作,如插入和查询。通过动态生成表名来实现分表。
  • 使用示例:展示如何使用这些类来实现分表功能。

这个方案适用于在同一数据库中按月份进行分表的需求,可以根据实际业务场景进一步扩展和优化。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/62514.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

详解SpringCloud集成Camunda7.19实现工作流审批(二)

本章将分享的是camunda流程设计器--Camunda Modeler的基本使用(对应camunda版本是7.19),包括bpmn流程图画法,各种控件使用以及一些日常业务场景的流程图的实现 参考资料: Camunda BPMN 基础组件-CSDN博客 Camunda: Exe…

webpack(react)基本构建

文章目录 概要整体架构流程技术名词解释技术细节小结 概要 Webpack 是一个现代 JavaScript 应用程序的静态模块打包工具。它的主要功能是将各种资源(如 JavaScript、CSS、图片等)视为模块,并将它们打包成一个或多个输出文件,以便…

html select下拉多选 修改yselect.js插件实现下拉多选,搜索,限制选中,默认回显等操作

需求:要在select标签实现下拉多选,搜索,限制选中,默认回显等操作,之前同事用的yselect.js,网上用的简直是寥寥无几,找了半天没找到限制选中的方法,看了源代码才发现根本没有&#xf…

c++哈希表(原理、实现、开放寻址法)适合新手

c系列哈希的原理及实现(上) 文章目录 c系列哈希的原理及实现(上)前言一、哈希的概念二、哈希冲突三、哈希冲突解决3.1、开放寻址法3.2、删除操作3.3、负载因子四、代码实现 总结 前言 红黑树平衡树和哈希有不同的用途。 红黑树、…

了解HTTPS以及CA在其中的作用

在这个信息爆炸的时代,每一次指尖轻触屏幕,都是一次数据的旅行。但您是否真正了解,这些数据在通往目的地的旅途中,是如何被保护的呢? HTTPS(HyperText Transfer Protocol Secure)是一种安全的网…

electron-vite_14窗口默认全屏铺满

有时候应用打包后,希望全屏显示;而默认的宽度和高度,是无法满足的;这时需要单独处理; 核心代码 // 1.引入screen对象 import { BrowserWindow, screen } from electron; function createWindow(): void {// 2.获取屏幕尺寸const { width, height } screen.getPrim…

mysql-为什么需要线程池

mysql-为什么需要线程池 MySQL线程池的概述与应用 MySQL线程池是MySQL数据库中的一个重要组件,旨在提高数据库的性能、吞吐量和可伸缩性。它通过管理数据库服务器的线程生命周期,减少了线程的创建和销毁的开销,并通过优化资源使用&#xff…

【接口封装】——10、系统托盘

解释&#xff1a; 1、定义好按钮的状态&#xff1a;创建 map 映射关系&#xff0c;即 一个名字对应一个按钮 2、对不同按钮实现不同的信号槽函数 头文件&#xff1a; #include "SysTrayIcon.h" #include <qwidget.h> #include "define.h" #include &…

Nginx——配置部署域名服务器路由nginx

文章目录 基本配置报错解决只能通过[域名]:[端口]/[API路径]的方式请求 基本配置 user www-data; worker_processes auto;error_log /var/log/nginx/error.log notice; pid /run/nginx.pid;events {worker_connections 1024; }http {include /etc/nginx/mime…

C. Raspberries

time limit per test 2 seconds memory limit per test 256 megabytes You are given an array of integers a1,a2,…,ana1,a2,…,an and a number kk (2≤k≤52≤k≤5). In one operation, you can do the following: Choose an index 1≤i≤n1≤i≤n,Set aiai1aiai1. F…

Flink学习连载文章8--时间语义

Time的分类 (时间语义) EventTime:事件(数据)时间,是事件/数据真真正正发生时/产生时的时间 IngestionTime:摄入时间,是事件/数据到达流处理系统的时间 ProcessingTime:处理时间,是事件/数据被处理/计算时的系统的时间 EventTime的重要性 假设&#xff0c;你正在去往地下停…

sizeof和strlen区分,(好多例子)

sizeof算字节大小 带\0 strlen算字符串长度 \0之前

Simulink的SIL软件在环测试

以基于模型的设计&#xff08;MBD&#xff09;的软件开发时&#xff0c;需要进行SIL&#xff08;软件在环测试&#xff09;。SIL测试就是在PC上验证模型是否与代码功能一致。在项目开展中&#xff0c;用在需要将控制器生成移植到硬件前&#xff0c;把控制器的模块生成代码&…

浅谈js中onmouseleave和onmouseout的区别

同步发布于我的网站 &#x1f680; 背景介绍基本概念区别详解 无子元素的情况有子元素的情况 实际应用场景 使用 onmouseleave使用 onmouseout 注意事项总结 背景介绍 在前端开发中&#xff0c;我们经常需要为元素绑定鼠标事件&#xff0c;以实现各种交互效果。onmouseleave…

【Git系列】利用 Bash 脚本获取 Git 最后一次非合并提交的提交人

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

36 基于单片机的电磁炉系统设计

目录 一、主要功能 二、硬件资源 三、程序编程 四、实现现象 一、主要功能 基于51单片机&#xff0c;通过DS18B20温度传感器检测温度&#xff0c;通过八位数码管显示&#xff0c; 如果温度超过阈值&#xff0c;则蜂鸣器报警&#xff0c;红灯亮起&#xff1b;若不超过阈值&…

『 Linux 』数据链路层 - ARP协议及数据链路层周边问题

文章目录 ARP协议ARP欺骗RARP协议 DNS服务ICMP协议ping 命令正向代理服务器反向代理服务器 ARP协议 博客『 Linux 』数据链路层 - MAC帧/以太网帧中提到,当数据需要再数据链路层进行无网络传输时需要封装为MAC帧,而MAC帧的报文结构如下: 帧头部分存在两个字段分别为 “目的地址…

MySQL(数据库)

1.数据库? 数据库是管理数据(增删改查CRUD)的软件 MySQL(开源&免费) 是一个数据库软件 (客户端-服务器)结构的软件 客户端服务器通过网络进行通信 客户端(Client):主动发起请求的一方,客户端给服务器发起的数据称为请求(request) 服务器(Server):被动接受请求的一方,…

vue3----API

组合式API 1.setup 定义的数据和方法必须return出去才能够被使用 不使用this,this指向了undefined <script> export default {setup () {console.log(setup)const message this is messageconst logmessage ()>{console.log(message)}return {message,logmessag…

服务器遭受DDoS攻击后如何恢复运行?

当服务器遭受 DDoS&#xff08;分布式拒绝服务&#xff09;攻击 后&#xff0c;恢复运行需要快速采取应急措施来缓解攻击影响&#xff0c;并在恢复后加强防护以减少未来攻击的风险。以下是详细的分步指南&#xff1a; 一、应急处理步骤 1. 确认服务器是否正在遭受 DDoS 攻击 …