泉州自助建站/全自动引流推广软件免费

泉州自助建站,全自动引流推广软件免费,最新的网站建设软件有哪些,住房城乡建设行业从业人员设计一个在Linux上运行的GCC C程序,同时连接两个不同的MySQL实例,两个实例中分别有两个Schema的表结构完全相同,复制一个实例中一个Schema里的所有表的数据到另一个实例中一个Schema里,使用以下快速高效的方法,加入异常…

设计一个在Linux上运行的GCC C++程序,同时连接两个不同的MySQL实例,两个实例中分别有两个Schema的表结构完全相同,复制一个实例中一个Schema里的所有表的数据到另一个实例中一个Schema里,使用以下快速高效的方法,加入异常处理,支持每隔固定时间重试一定次数,每张表的复制运行状态和记录条数,开始结束时间戳,运行时间,以及每个批次的运行状态,开始结束时间戳,运行时间,总记录条数都要到运行日志文件里,日志文件全部放在logs目录下,每天一个.log扩展名的文本文件,文件名带日期,所有运行参数写在json配置文件中。

C++程序分步解决方案:


文件结构

├── config.json          # 配置文件
├── include/             # 头文件目录
│   ├── DatabaseManager.h
│   ├── Logger.h
│   └── DataReplicator.h
├── src/                # 源文件目录
│   ├── main.cpp
│   ├── DatabaseManager.cpp
│   ├── Logger.cpp
│   └── DataReplicator.cpp
└── CMakeLists.txt      # 编译配置

1. 配置文件 (config.json)

{"source": {"host": "127.0.0.1","port": 3306,"user": "root","password": "source_pass","schema": "source_db"},"target": {"host": "127.0.0.1","port": 3307,"user": "root","password": "target_pass","schema": "target_db"},"retry": {"max_attempts": 3,"interval_seconds": 5},"batch_size": 1000,"log_dir": "./logs"
}

2. 日志类 (Logger.h/Logger.cpp)

// Logger.h
#include <fstream>
#include <string>
#include <mutex>
#include <chrono>class Logger {
public:static Logger& getInstance();void log(const std::string& message);private:Logger();~Logger();std::ofstream logFile;std::mutex mtx;std::string getCurrentDate();std::string getCurrentTimestamp();void openNewLogFile();
};

3. 数据库管理类 (DatabaseManager.h/DatabaseManager.cpp)

// DatabaseManager.h
#include <mysqlx/xdevapi.h>class DatabaseManager {
public:DatabaseManager(const mysqlx::SessionSettings& settings);mysqlx::Session& getSession();mysqlx::Schema getSchema(const std::string& name);private:mysqlx::Session session;
};

4. 数据复制核心类 (DataReplicator.h/DataReplicator.cpp)

// DataReplicator.h
#include <vector>
#include <string>
#include <functional>class DataReplicator {
public:struct TableStats {std::string table_name;size_t total_records = 0;std::chrono::system_clock::time_point start_time;std::chrono::system_clock::time_point end_time;bool success = false;};void replicateAllTables();private:std::vector<std::string> getSourceTables();void replicateTable(const std::string& tableName);void batchInsert(mysqlx::Table& source, mysqlx::Table& target, int batchSize);void withRetry(std::function<void()> operation, const std::string& context);
};

5. 主程序 (main.cpp)

#include "DatabaseManager.h"
#include "DataReplicator.h"
#include "Logger.h"
#include <nlohmann/json.hpp>using json = nlohmann::json;json loadConfig() {// 实现配置文件加载
}int main() {auto config = loadConfig();DatabaseManager sourceManager(createSettings(config["source"]));DatabaseManager targetManager(createSettings(config["target"]));DataReplicator replicator(sourceManager, targetManager, config);replicator.replicateAllTables();return 0;
}

6. 关键实现细节

  1. 批量数据复制
void DataReplicator::batchInsert(mysqlx::Table& source, mysqlx::Table& target, int batchSize) {auto result = source.select("*").execute();std::vector<mysqlx::Row> buffer;while (auto row = result.fetchOne()) {buffer.push_back(row);if (buffer.size() >= batchSize) {target.insert().values(buffer).execute();buffer.clear();}}if (!buffer.empty()) {target.insert().values(buffer).execute();}
}
  1. 带重试的逻辑
void DataReplicator::withRetry(std::function<void()> operation, const std::string& context) {int attempts = 0;while (attempts < maxRetries) {try {operation();return;} catch (const mysqlx::Error& e) {Logger::getInstance().log("Error: " + std::string(e.what()));if (++attempts >= maxRetries) throw;std::this_thread::sleep_for(retryInterval);}}
}
  1. 日志记录实现
void Logger::log(const std::string& message) {std::lock_guard<std::mutex> lock(mtx);if (logFile.tellp() == 0 || getCurrentDate() != currentDate) {openNewLogFile();}logFile << "[" << getCurrentTimestamp() << "] " << message << std::endl;
}

7. 编译配置 (CMakeLists.txt)

cmake_minimum_required(VERSION 3.10)
project(DataReplicator)set(CMAKE_CXX_STANDARD 17)find_package(MySQLCppConn REQUIRED)
find_package(nlohmann_json REQUIRED)include_directories(include${MySQLCppConn_INCLUDE_DIRS}
)add_executable(data_replicatorsrc/main.cppsrc/DatabaseManager.cppsrc/Logger.cppsrc/DataReplicator.cpp
)target_link_libraries(data_replicatorPRIVATE MySQLCppConn::mysqlcppconnPRIVATE nlohmann_json::nlohmann_jsonpthread ssl crypto
)

8. 运行方式

mkdir -p build && cd build
cmake ..
make
./data_replicator

9. 日志示例

[2023-10-05 14:30:45] [users] STARTED
[2023-10-05 14:30:47] [users] BATCH 1-1000 inserted (1.2s)
[2023-10-05 14:30:49] [users] COMPLETED 1500 records (4.5s)
[2023-10-05 14:30:50] [products] FAILED: Duplicate entry 'XYZ' (Attempt 1/3)
[2023-10-05 14:30:55] [products] RETRY SUCCESS (2nd attempt)

优化建议

  1. 并行处理
std::vector<std::future<void>> futures;
for (auto& table : tables) {futures.push_back(std::async(std::launch::async, [&](){replicateTable(table);}));
}
for (auto& f : futures) f.wait();
  1. 索引优化
-- 复制前禁用索引
ALTER TABLE target_table DISABLE KEYS;-- 复制后重建索引
ALTER TABLE target_table ENABLE KEYS;
  1. 内存管理
  • 使用智能指针管理数据库连接
  • 限制同时打开的连接数
  • 实现连接池机制

这个解决方案实现了:

  • 配置驱动的数据库连接
  • 带重试机制的可靠数据传输
  • 详细的运行日志记录
  • 批量处理优化
  • 异常安全保证
  • 可扩展的架构设计

完整的C++代码实现,包括各个头文件和源文件以及 CMakeLists.txt 的完整内容:

请确保安装了MySQL C++ Connector和 nlohmann_json 库,并按照运行方式中的步骤进行编译和运行。

include/DatabaseManager.h

#include <mysqlx/xdevapi.h>class DatabaseManager {
public:DatabaseManager(const mysqlx::SessionSettings& settings);mysqlx::Session& getSession();mysqlx::Schema getSchema(const std::string& name);private:mysqlx::Session session;
};

include/Logger.h

#include <fstream>
#include <string>
#include <mutex>
#include <chrono>class Logger {
public:static Logger& getInstance();void log(const std::string& message);private:Logger();~Logger();std::ofstream logFile;std::mutex mtx;std::string getCurrentDate();std::string getCurrentTimestamp();void openNewLogFile();std::string currentDate;
};

include/DataReplicator.h

#include <vector>
#include <string>
#include <functional>
#include <mysqlx/xdevapi.h>
#include <nlohmann/json.hpp>using json = nlohmann::json;class DataReplicator {
public:struct TableStats {std::string table_name;size_t total_records = 0;std::chrono::system_clock::time_point start_time;std::chrono::system_clock::time_point end_time;bool success = false;};DataReplicator(DatabaseManager& sourceManager, DatabaseManager& targetManager, const json& config);void replicateAllTables();private:std::vector<std::string> getSourceTables();void replicateTable(const std::string& tableName);void batchInsert(mysqlx::Table& source, mysqlx::Table& target, int batchSize);void withRetry(std::function<void()> operation, const std::string& context);DatabaseManager& sourceManager;DatabaseManager& targetManager;json config;int maxRetries;std::chrono::seconds retryInterval;int batchSize;
};

src/DatabaseManager.cpp

#include "../include/DatabaseManager.h"DatabaseManager::DatabaseManager(const mysqlx::SessionSettings& settings) : session(settings) {if (!session.isOpen()) {throw std::runtime_error("Failed to connect to database");}
}mysqlx::Session& DatabaseManager::getSession() {return session;
}mysqlx::Schema DatabaseManager::getSchema(const std::string& name) {return session.getSchema(name);
}

src/Logger.cpp

#include "../include/Logger.h"
#include <iostream>
#include <iomanip>Logger::Logger() {openNewLogFile();
}Logger::~Logger() {logFile.close();
}Logger& Logger::getInstance() {static Logger instance;return instance;
}std::string Logger::getCurrentDate() {auto now = std::chrono::system_clock::now();auto in_time_t = std::chrono::system_clock::to_time_t(now);std::tm tm_info;localtime_r(&in_time_t, &tm_info);std::ostringstream oss;oss << std::put_time(&tm_info, "%Y-%m-%d");return oss.str();
}std::string Logger::getCurrentTimestamp() {auto now = std::chrono::system_clock::now();auto in_time_t = std::chrono::system_clock::to_time_t(now);std::tm tm_info;localtime_r(&in_time_t, &tm_info);std::ostringstream oss;oss << std::put_time(&tm_info, "%Y-%m-%d %H:%M:%S");return oss.str();
}void Logger::openNewLogFile() {currentDate = getCurrentDate();std::string logFileName = config["log_dir"].get<std::string>() + "/" + currentDate + ".log";logFile.open(logFileName, std::ios::app);if (!logFile.is_open()) {std::cerr << "Failed to open log file: " << logFileName << std::endl;}
}void Logger::log(const std::string& message) {std::lock_guard<std::mutex> lock(mtx);if (logFile.tellp() == 0 || getCurrentDate()!= currentDate) {openNewLogFile();}logFile << "[" << getCurrentTimestamp() << "] " << message << std::endl;
}

src/DataReplicator.cpp

#include "../include/DataReplicator.h"
#include <iostream>
#include <future>DataReplicator::DataReplicator(DatabaseManager& sourceManager, DatabaseManager& targetManager, const json& config): sourceManager(sourceManager), targetManager(targetManager), config(config) {maxRetries = config["retry"]["max_attempts"];retryInterval = std::chrono::seconds(config["retry"]["interval_seconds"]);batchSize = config["batch_size"];
}std::vector<std::string> DataReplicator::getSourceTables() {auto schema = sourceManager.getSchema(config["source"]["schema"]);auto tables = schema.getTables();std::vector<std::string> tableNames;for (auto& table : tables) {tableNames.push_back(table.getName());}return tableNames;
}void DataReplicator::replicateTable(const std::string& tableName) {auto sourceSchema = sourceManager.getSchema(config["source"]["schema"]);auto targetSchema = targetManager.getSchema(config["target"]["schema"]);auto sourceTable = sourceSchema.getTable(tableName);auto targetTable = targetSchema.getTable(tableName);TableStats stats;stats.table_name = tableName;stats.start_time = std::chrono::system_clock::now();try {withRetry([&]() {batchInsert(sourceTable, targetTable, batchSize);}, tableName);stats.success = true;} catch (const mysqlx::Error& e) {Logger::getInstance().log("Error replicating table " + tableName + ": " + std::string(e.what()));stats.success = false;}stats.end_time = std::chrono::system_clock::now();auto duration = std::chrono::duration_cast<std::chrono::seconds>(stats.end_time - stats.start_time).count();std::string status = stats.success? "COMPLETED" : "FAILED";Logger::getInstance().log("[" + tableName + "] " + status + " " + std::to_string(stats.total_records) + " records (" + std::to_string(duration) + "s)");
}void DataReplicator::batchInsert(mysqlx::Table& source, mysqlx::Table& target, int batchSize) {auto result = source.select("*").execute();std::vector<mysqlx::Row> buffer;int batchCount = 0;auto batchStartTime = std::chrono::system_clock::now();while (auto row = result.fetchOne()) {buffer.push_back(row);stats.total_records++;if (buffer.size() >= batchSize) {withRetry([&]() {target.insert().values(buffer).execute();}, stats.table_name + " batch " + std::to_string(++batchCount));auto batchEndTime = std::chrono::system_clock::now();auto batchDuration = std::chrono::duration_cast<std::chrono::seconds>(batchEndTime - batchStartTime).count();Logger::getInstance().log("[" + stats.table_name + "] BATCH " + std::to_string((batchCount - 1) * batchSize + 1) + "-" + std::to_string(batchCount * batchSize) + " inserted (" + std::to_string(batchDuration) + "s)");batchStartTime = batchEndTime;buffer.clear();}}if (!buffer.empty()) {withRetry([&]() {target.insert().values(buffer).execute();}, stats.table_name + " batch " + std::to_string(++batchCount));auto batchEndTime = std::chrono::system_clock::now();auto batchDuration = std::chrono::duration_cast<std::chrono::seconds>(batchEndTime - batchStartTime).count();Logger::getInstance().log("[" + stats.table_name + "] BATCH " + std::to_string((batchCount - 1) * batchSize + 1) + "-" + std::to_string(stats.total_records) + " inserted (" + std::to_string(batchDuration) + "s)");}
}void DataReplicator::withRetry(std::function<void()> operation, const std::string& context) {int attempts = 0;while (attempts < maxRetries) {try {operation();return;} catch (const mysqlx::Error& e) {Logger::getInstance().log("Error: " + std::string(e.what()) + " (" + context + " Attempt " + std::to_string(attempts + 1) + "/" + std::to_string(maxRetries) + ")");if (++attempts >= maxRetries) throw;std::this_thread::sleep_for(retryInterval);}}
}void DataReplicator::replicateAllTables() {auto tables = getSourceTables();std::vector<std::future<void>> futures;for (auto& table : tables) {futures.push_back(std::async(std::launch::async, [&](){replicateTable(table);}));}for (auto& f : futures) f.wait();
}

src/main.cpp

#include "../include/DatabaseManager.h"
#include "../include/DataReplicator.h"
#include "../include/Logger.h"
#include <nlohmann/json.hpp>
#include <fstream>using json = nlohmann::json;json loadConfig() {std::ifstream configFile("config.json");json config;configFile >> config;return config;
}mysqlx::SessionSettings createSettings(const json& config) {mysqlx::SessionSettings settings;settings.setHost(config["host"]);settings.setPort(config["port"]);settings.setUser(config["user"]);settings.setPassword(config["password"]);return settings;
}int main() {auto config = loadConfig();mysqlx::SessionSettings sourceSettings = createSettings(config["source"]);mysqlx::SessionSettings targetSettings = createSettings(config["target"]);DatabaseManager sourceManager(sourceSettings);DatabaseManager targetManager(targetSettings);DataReplicator replicator(sourceManager, targetManager, config);replicator.replicateAllTables();return 0;
}

CMakeLists.txt

cmake_minimum_required(VERSION 3.10)
project(DataReplicator)set(CMAKE_CXX_STANDARD 17)find_package(MySQLCppConn REQUIRED)
find_package(nlohmann_json REQUIRED)include_directories(include${MySQLCppConn_INCLUDE_DIRS}
)add_executable(data_replicatorsrc/main.cppsrc/DatabaseManager.cppsrc/Logger.cppsrc/DataReplicator.cpp
)target_link_libraries(data_replicatorPRIVATE MySQLCppConn::mysqlcppconnPRIVATE nlohmann_json::nlohmann_jsonpthread ssl crypto
)

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

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

相关文章

JBoltAI_SpringBoot如何区分DeepSeek R1深度思考和具体回答的内容(基于Ollama)?

当我们用Ollama运行DeepSeek R1模型&#xff0c;向它提问时&#xff0c;会发现它的回答里是有think标签的 如果我们直接将Ollama的回复用于生产环境&#xff0c;肯定是不行的&#xff0c;对于不同的场景&#xff0c;前面输出的一堆内容&#xff0c;可能并不需要在客户端展示&a…

将DeepSeek接入vscode的N种方法

接入deepseek方法一:cline 步骤1:安装 Visual Studio Code 后,左侧导航栏上点击扩展。 步骤2:搜索 cline,找到插件后点击安装。 步骤3:在大模型下拉菜单中找到deep seek,然后下面的输入框输入你在deepseek申请的api key,就可以用了 让deepseek给我写了一首关于天气的…

Mac本地部署Deep Seek R1

Mac本地部署Deep Seek R1 1.安装本地部署大型语言模型的工具 ollama 官网&#xff1a;https://ollama.com/ 2.下载Deepseek R1模型 网址&#xff1a;https://ollama.com/library/deepseek-r1 根据电脑配置&#xff0c;选择模型。 我的电脑&#xff1a;Mac M3 24G内存。 这…

(七)消息队列-Kafka 序列化avro(传递)

&#xff08;七&#xff09;消息队列-Kafka 序列化avro&#xff08;传递&#xff09; 客从远方来&#xff0c;遗我双鲤鱼。呼儿烹鲤鱼&#xff0c;中有尺素书。 ——佚名《饮马长城窟行》 本文已同步CSDN、掘金平台、知乎等多个平台&#xff0c;图片依然保持最初发布的水印&…

PXE批量网络装机与Kickstart自动化安装工具

目录 一、系统装机的原理 1.1、系统装机方式 1.2、系统安装过程 二、PXE批量网络装机 2.1、PXE实现原理 2.2、搭建PXE实际案例 2.2.1、安装必要软件 2.2.2、搭建DHCP服务器 2.2.3、搭建TFTP服务器 2.2.4、挂载镜像并拷贝引导文件到tftp服务启动引导文件夹下 2.2.5、编…

【全栈开发】从0开始搭建一个图书管理系统【一】框架搭建

【全栈开发】从0开始搭建一个图书管理系统【一】框架搭建 前言 现在流行降本增笑&#xff0c;也就是不但每个人都要有事干不能闲着&#xff0c;更重要的是每个人都要通过报功的方式做到平日的各项工作异常饱和&#xff0c;实现1.5人的支出干2人的活计。单纯的数据库开发【肤浅…

部署Flink1.20.1

1、设置环境变量 export JAVA_HOME/cluster/jdk export CLASSPATH.:$JAVA_HOME/lib/tools.jar:$JAVA_HOME/lib/dt.jarp #export HIVE_HOME/cluster/hive export MYSQL_HOME/cluster/mysql export HADOOP_HOME/cluster/hadoop3 export HADOOP_CONF_DIR$HADOOP_HOME/etc/hadoop …

【超详细】神经网络的可视化解释

《------往期经典推荐------》 一、AI应用软件开发实战专栏【链接】 项目名称项目名称1.【人脸识别与管理系统开发】2.【车牌识别与自动收费管理系统开发】3.【手势识别系统开发】4.【人脸面部活体检测系统开发】5.【图片风格快速迁移软件开发】6.【人脸表表情识别系统】7.【…

深入了解 Python 中的 MRO(方法解析顺序)

文章目录 深入了解 Python 中的 MRO&#xff08;方法解析顺序&#xff09;什么是 MRO&#xff1f;如何计算 MRO&#xff1f;C3 算法的合并规则C3 算法的合并步骤示例&#xff1a;合并过程解析 MRO 解析失败的场景使用 mro() 方法查看 MRO示例 1&#xff1a;基本用法 菱形继承与…

数字化赋能:制造业如何突破低效生产的瓶颈?

随着全球经济的快速发展与市场需求的变化&#xff0c;制造业面临着前所未有的压力与挑战。生产效率、资源管理、品质控制、成本控制等方面的问题日益突出&#xff0c;尤其是低效生产成为了许多制造企业亟待解决的瓶颈。在这种背景下&#xff0c;数字化转型成为提升制造业效率的…

Element-Plus,使用 El-form中 的 scroll-to-error 没有效果问题记录

因业务需要表单组件中嵌套着表格列表&#xff0c;内容比较多&#xff1b; 所以需要表单校验不通过时&#xff0c;自动定位到不通过的节点&#xff1b; 但发现这个像是没有起到效果一样&#xff0c;后面就是排查的思路了&#xff1a; 容器高度问题&#xff1a;如果表单容器的高度…

LabVIEW同步数据采集功能

VI通过使用数据采集&#xff08;DAQ&#xff09;硬件系统&#xff0c;进行多通道同步采集&#xff0c;实时获取模拟信号数据。它利用外部时钟信号触发数据采集&#xff0c;支持连续采样模式&#xff0c;并将采集到的数据实时显示在波形图上&#xff0c;方便用户进行数据监控和分…

【Docker】使用Docker搭建-MySQL数据库服务

零、更换Docker镜像源 因为国内现在封锁了Docker默认拉取镜像的站点&#xff08;DockerHub&#xff09;&#xff0c;而且国内大部分Docker镜像站已全部下线&#xff0c;导致现在很多朋友在拉取镜像的时候会出现无法拉取的现象&#xff0c;这时候就需要进行更换Docker镜像源。 可…

Docker基础-常见命令

docker images -查看所有的本地镜像。 docker pull -把远端镜像拉取到本地。 docker rmi -删除镜像。 docker push -推到镜像仓库。 docker run -创建并运行容器&#xff08;自动化&#xff0c;如果发现镜像不存在会先去拉取&#xff0c; 拉取完了以后再去自动创建容器&am…

TinyEngine v2.2版本发布:支持页面嵌套路由,提升多层级路由管理能力开发分支调整

2025年春节假期已过&#xff0c;大家都带着慢慢的活力回到了工作岗位。为了让大家在新的一年继续感受到 Tiny Engine 的成长与变化&#xff0c;我们很高兴地宣布&#xff1a;TinyEngine v2.2版本正式发布&#xff01;本次更新带来了重要的功能增强------页面支持嵌套路由&#…

LSTM长短期记忆网络-原理分析

1 简介 概念 LSTM&#xff08;Long Short-Term Memory&#xff09;也称为长短期记忆网络&#xff0c;是一种改进的循环神经网络&#xff08;RNN&#xff09;&#xff0c;专门设计用于解决传统RNN的梯度消失问题和长程依赖问题。LSTM通过引入门机制和细胞状态&#xff0c;能够更…

【leetcode hot 100 42】接雨水

错误解法&#xff1a;若height[left]>height[right]则代表有坑 class Solution {public int trap(int[] height) {int left 0;int area 0;while(left<height.length-1){// 找坑int right left1;while(right<height.length-1 && height[left]>height[ri…

【前端进阶】09 编程思维:从事件驱动到数据驱动

事件驱动与数据驱动 GUI与事件事件驱动数据驱动事件驱动和数据驱动的区别 GUI与事件 JavaScript作为浏览器的脚本语言&#xff0c;主要用途是与用户互动、操作DOM&#xff0c;实现页面UI和DOM操作&#xff0c;属于GUI&#xff08;图形用户界面&#xff09;编程 GUI程序注重用…

【实战 ES】实战 Elasticsearch:快速上手与深度实践-1.3.1单节点安装(Docker与手动部署)

&#x1f449; 点击关注不迷路 &#x1f449; 点击关注不迷路 &#x1f449; 点击关注不迷路 文章大纲 10分钟快速部署Elasticsearch单节点环境1. 系统环境要求1.1 硬件配置推荐1.2 软件依赖 2. Docker部署方案2.1 部署流程2.2 参数说明2.3 性能优化建议 3. 手动部署方案3.1 安…

vscode下载安装教程(附安装包)vscode图文安装教程最新版

文章目录 一、vscode下载二、vscod安装教程1.启动vscode安装程序&#xff1a;2.应对提示&#xff1a;3.接受协议&#xff1a;4.更改vscode安装路径&#xff1a;5.推进安装vscode&#xff1a;6.创建vscode快捷方式&#xff1a;7.开始安装vscode&#xff1a;8.完成vscode安装&…