尧图网络 高端网站定制 · 原创设计
免费咨询热线
400-888-6620
免费获取方案
多虚拟电厂主从博弈碳交易调度优化:ACPSO-EI-Kriging实战解析
做虚拟电厂调度优化的朋友应该都体会过那种被一堆名词糊脸的感觉ACPSO、EI、Kriging、多虚拟电厂、主从博弈、碳交易……每个单拎出来都能讲半小时但真正要把它们串进一套能跑的Python代码里又是另一回事。这套研究框架这几年特别火核心思路并不玄乎——多虚拟电厂之间既合作又竞争上层定电价策略下层VPP各自优化调度同时碳交易成本又被揉进目标函数里最后用三层嵌套优化去求解。这篇文章我尽量用工程实践的口吻把这套框架怎么建模、算法为什么这样选、Python代码怎么组织以及复现过程中最容易翻车的地方一次说清楚。需要提前说清楚这偏文章讲的是思路和可落地的代码骨架不是把几千行完整源码贴出来。因为这类代码往往和具体论文的算例强绑定全贴出来反而没有迁移价值。我会给出关键模块的实现逻辑和核心函数片段照着这套骨架你可以换自己的数据、自己的目标函数快速改出一版可运行的原型。1. 多虚拟电厂优化调度单VPP和多个VPP的研究粒度差异1.1 虚拟电厂到底聚合了什么虚拟电厂VPP不是一个物理电厂而是一个由分布式光伏、风电、燃气轮机、储能系统、柔性负荷等资源聚合起来的协调控制实体。每个VPP内部资源千差万别有的光伏占比高有的储能容量大有的燃气机组多。搞多VPP研究的前提是每个VPP都是独立利益主体它们会基于自身的资源禀赋对外部价格信号做出反应。单VPP调度问题的本质是“在一个厂内做经济调度”资源属于同一个利益主体目标函数通常是运行成本最小化、碳排放最小化、弃风弃光率最小化等约束是各机组的出力上下限、爬坡率、储能SOC、功率平衡等。这类问题已经可以做得非常细求解器直接上MILP/MINLP都行。但一旦从单VPP走向多VPP问题性质就变了。多个VPP共享同一个配电网它们之间有交互功率、有共同面对的上级市场电价、也有各自独立的利益诉求。如果直接用集中优化把所有VPP揉成一个整体去算全局最优算出来的结果在经济上并不可信——因为现实世界里没有哪个VPP愿意为了“全局最优”牺牲自己的利润。1.2 多VPP之间的竞争与主从博弈结构多VPP场景下主从博弈Stackelberg game是非常自然的建模工具。上层通常是电网运营商、负荷聚合平台或能源服务商它拥有制定电价或交易价格的权力下层是各个VPP它们根据上层给出的价格信号调整内部机组出力和购售电计划。这正好对应了现实中的“领导-跟随”关系。平台先出价VPP再响应平台根据响应结果调整价格最后收敛到一个博弈均衡。你如果实际写过这类模型就会知道这个博弈关系最大的难点不是建模而是求解——每评估一次上层策略就要把所有下层的优化问题重新求解一遍计算代价极大。1.3 为什么一定是“多目标”标题里“多目标主从博弈”中的“多目标”在不同论文里含义可能不同我建议你这样理解下层每个VPP内目标函数通常不止一个比如运行成本、碳排放量、用户满意度/负荷削减量这些目标之间互相冲突构成一组帕累托前沿上层平台的目标也不是单一的比如要平衡全网经济性和低碳性、要确保各VPP之间公平性。这种“上下都是多目标”的结构下不能简单地把所有目标线性加权成一个值了事否则会丢掉帕累托前沿的丰富信息。后续算法设计里EI/Kriging的配合方式也必须考虑这一点。2. 碳交易机制如何嵌入优化模型2.1 碳配额与碳排放流的核算逻辑碳交易机制的建模本质是在原优化问题里额外加了一个“碳资产”约束和一个“碳成本”目标。常见的模型是基准线法分配初始配额每个VPP根据历史出力或负荷水平免费获得一定的碳排放配额实际运行中如果排放超过配额就需要去碳市场购买配额如果排放低于配额则可以把多余配额卖出获利。对于每个VPPi来说碳相关的净成本可以写成C_carbon_i P_carbon * (E_actual_i - E_quota_i)其中P_carbon是碳交易价格E_actual_i是VPP实际碳排放量E_quota_i是初始配额。当E_actual_i E_quota_i时成本为正当低于配额时成本为负等于获得了额外收益。关键是要区分清楚碳成本不是作用在“总成本”外面的一个固定值它是跟机组出力相关的变量。比如燃气轮机每发一度电的碳排放强度是固定的那碳成本就直接进入该机组的边际成本里从而改变VPP对电价信号的响应行为。这就是碳交易影响主从博弈均衡的关键传导路径。2.2 碳排放约束与目标函数的具体写法在目标函数层面最常见的是把碳成本并入每个VPP的总成本min C_fuel C_ope C_market C_carbon其中C_fuel是燃料成本C_market是与上级市场的购售电费用C_carbon是碳交易成本。如果你想做多目标可以把C_carbon单独拎出来作为一个独立目标例如min (C_fuel C_ope C_market, C_carbon)然后去求帕累托前沿。约束层面需要补充机组碳排放量等于机组出力乘以排放强度E_i,t sum_k (alpha_k * P_k,i,t)总实际排放量等于各时段排放之和E_actual_i sum_t E_i,t碳交易量有上下限防止模型通过碳市场无限套利这里有个容易被忽略的细节碳配额是按一个调度周期通常是一天来结算的但碳排放约束在每个时段都有耦合关系。你在代码里不能只写一个不等式约束还得把时段间的耦合用累计量表达出来否则算出来的结果会“借用”碳配额出现某些时段排放超出真实允许范围的假象。2.3 碳价波动对博弈均衡的影响如果只是把碳价设成一个固定常数那碳交易机制就被简化成了“加一项固定系数”价值不大。更合理的做法是让碳价成为一个可调参数通过灵敏度分析观察不同碳价水平下VPP的出力策略和平台定价策略的变化。实测中你会发现一个很有意思的规律碳价升高初期VPP会倾向于减少燃气轮机出力、增加储能放电、调用更多柔性负荷调节这会推高系统对电价的敏感度碳价继续升高到某个阈值后VPP的响应会变钝因为能调整的灵活性资源已经用完了。这个阈值位置因VPP资源构成不同而不同在多VPP博弈里会导致平台的最优定价策略出现“分段变化”。3. 主从博弈的双层求解框架3.1 上层平台定价决策与下层VPP响应先明确变量定义。设上层平台的决策变量是向各VPP发布的购电价lambda_buy_i和售电价lambda_sell_i每个VPP i 在下层求解如下问题min f_i(x_i, lambda_buy_i, lambda_sell_i) s.t. g_i(x_i) 0其中x_i是VPP i 的内部变量包括各机组出力、储能充放电功率、购售电功率等。下层求解完后把购售电量返回给上层上层计算自己的收益或者社会福利目标。博弈的均衡条件是在给定所有VPP响应策略的前提下上层任意调整价格策略都无法进一步改善自身目标同时每个VPP也在给定价格下达到了自身最优。3.2 两种主流的求解路线解法上业内通常走两条路一条是解析解法。把下层优化问题用KKT条件替换再通过强对偶定理把下层目标中的价格变量消除把整个主从博弈转成一个带互补约束的单层优化问题MPEC再用商业求解器求解。这条路数学上很漂亮但前提是下层问题是凸的、且是可导的。一旦下层引入了0-1变量比如储能充放电状态、机组启停这条路就失效了。另一条就是启发式迭代求解。上层用智能优化算法不断产生价格策略下层用MILP求解器快速求解每个VPP的响应把响应结果带上层算目标函数值再反馈给优化算法进化。这套路实现简单、对模型假设要求低缺点是计算量大。ACPSO-EI-Kriging框架就是专门为这条路做加速的。3.3 博弈均衡的收敛判据用迭代法求解博弈问题时收不收敛、收敛到哪里是个必须正面回答的问题。实际工程中常用的判据有两个价格波动收敛连续两代上层价格向量的相对变化小于某个阈值目标函数收敛连续K代上层目标函数值的滚动均值不再明显下降。但这里要提醒一个坑启发式算法只能给出“近似纳什均衡”严格意义上你无法证明找到的是全局均衡点。所以论文里通常要做多次随机初始化取最优结果同时用不同算法对比验证稳定性。实际写代码时可以做一个多层重启机制——外层循环跑多个随机种子内层循环做精细搜索这样结果才比较稳。4. ACPSO-EI-Kriging协同优化原理解读4.1 Kriging模型为什么适合这个场景主从博弈求解最大的痛点是评估一次上层策略的成本太高——你要把所有VPP的下层优化都跑一遍跑一次可能要几十秒甚至几分钟。如果用启发式算法直接搜索上层可能需要上千次评估这在工程上根本跑不动。Kriging模型也叫高斯过程回归的作用就是当“替身”。它用少量真实评估的样本点训练出一个代理模型这个模型不仅能给出任意点的预测值还能给出预测的不确定性方差。也就是说Kriging不只是告诉你“哪个点可能最优”还告诉你“哪里是模型最不确定的区域”。在Python里可以用pykrige包也可以用scikit-learn里的GaussianProcessRegressor。实际体验下来如果输入维度不高、样本量不超过几百个两者效果差别不大GaussianProcessRegressor的接口更友好和网格搜索、交叉验证这些工具配合也更顺。4.2 自适应混沌粒子群算法ACPSO改进点ACPSO是在标准PSO上做了两处典型改进名字已经透露了自适应和混沌。标准PSO的初始化是随机分布容易造成粒子分布不均在复杂多峰问题里容易漏掉最优区域。混沌初始化的思路是用混沌序列替代随机序列来生成初始粒子位置最常用的是Logistic映射x_{n1} mu * x_n * (1 - x_n)当mu接近4时序列表现出极好的遍历性粒子能更均匀地铺满搜索空间。自适应体现在惯性权重w上。标准PSO把w设成固定值或者线性递减值但在实际求解中固定值很难兼顾“前期全局探索”和“后期局部精搜”两个需求。ACPSO的做法是根据粒子群当前的聚集程度动态调整w——粒子越分散说明还在探索阶段w加大粒子都挤在一起了说明已经进入开发阶段w减小。常用公式是w w_min (w_max - w_min) * (1 - diversity / diversity_max)其中diversity是粒子群体多样性度量可以定义成平均距离或者方差。把ACPSO用在Kriging辅助优化里还有一个特殊作用因为Kriging模型本身是光滑的、无噪声的PSO在搜这种代理模型时极容易陷入局部极值混沌扰动相当于给搜索加了“逃逸机制”实测下来确实比普通PSO稳很多。4.3 EI期望改进加点准则EIExpected Improvement是代理模型优化的核心决策准则。它解决的是采样点选择问题给定Kriging模型预测的均值mu(x)和方差sigma(x)应该选择哪个新点做下一次真实评估EI的值由两部分组成EI(x) (f_best - mu(x)) * Phi(z) sigma(x) * phi(z)其中f_best是当前已知最优值z (f_best - mu(x)) / sigma(x)Phi和phi分别是标准正态分布的CDF和PDF。第一项代表“这个点预测值比当前最优好多少”的潜力第二项代表“模型对这个点有多不确定”。所以EI天然地在“开发”和“探索”之间做了平衡。每轮迭代的步骤是对Kriging模型搜索EI最大的点找到这个点后用真实的上下层博弈评估它把真实评估结果加入训练集重新训练Kriging重复直到收敛。整个框架做完真实评估次数通常能减少一个数量级。原来要跑1000次双层博弈现在跑100-200次就能得到相当好的结果省下的都是真实项目里最贵的计算时间。4.4 多目标场景下ACPSO-EI-Kriging的适配这块是最容易卡壳的地方我多写几句。标准EI是面向单目标的多目标问题怎么办通常有两种变通方式一种是把多个目标通过权重或归一化合并成单目标另一种是分别对每个目标建一个Kriging模型再用多目标EI准则比如EHVIExpected Hypervolume Improvement选点。实战中我更推荐前者做主线。虽然理论上EHVI更严谨但它的计算复杂度随目标个数增加增长得很快目标是3个以上时很容易变成性能瓶颈。先用权重法把多目标转单目标跑通整个ACPSO-EI-Kriging流程如果是论文需求再加EHVI的对比实验这个策略在开发效率上最划算。5. Python代码实现与工程细节5.1 整体工程目录结构这类代码项目最怕“一个大文件写到底”。一旦调参和换数据你就会后悔当初没分层。我建议按下面的目录组织project/ ├── main.py # 主流程入口 ├── config.py # 所有参数配置文件 ├── data/ # 风光负荷数据、碳配额数据 ├── models/ │ ├── vpp.py # VPP类定义 │ ├── market.py # 上层平台 │ └── carbon.py # 碳交易模块 ├── optimization/ │ ├── acpso.py # 自适应混沌粒子群 │ ├── kriging_model.py # Kriging代理模块 │ ├── ei.py # EI加点准则 │ └── lower_optimizer.py # VPP下层优化求解 └── utils/ ├── data_loader.py └── plot.pyconfig.py把能抽的参数全部抽出来VPP个数、机组参数、碳配额、碳价、PSO种群规模、混沌映射参数、EI迭代轮数等。这些参数后期调起来改一个文件就行不用满代码库翻。5.2 下层VPP优化问题的建模与求解接口下层VPP优化是整个框架里最频繁被调用的模块性能必须优先考虑。每个VPP的决策变量包括各机组出力、储能充放电功率、与上级购售电量约束包括功率平衡、机组出力上下限、爬坡约束、储能SOC约束。使用cvxpy建模是个不错的选择它把建模和求解器分离换求解器只需要改一行。一个简化的VPP下层优化框架像这样import cvxpy as cp import numpy as np class VPP: def __init__(self, generation_data, storage_params, load_forecast): self.gen_data generation_data # 各机组参数 self.storage_params storage_params self.load load_forecast def solve_lower(self, buy_price, sell_price, carbon_price, carbon_quota): T len(self.load) # 决策变量 p_gt cp.Variable((self.gen_data[gas_gen_num], T)) # 燃气轮机出力 p_grid cp.Variable(T) # 从上级购电为正 p_sto cp.Variable(T) # 储能放电为正 soc cp.Variable(T 1) # 储能SOC # 目标函数 fuel_cost self.gas_fuel_cost(p_gt) storage_cost self.storage_op_cost(p_sto) market_cost cp.sum(cp.multiply(buy_price, cp.pos(p_grid)) - cp.multiply(sell_price, cp.neg(p_grid))) carbon_actual self.calc_emission(p_gt) carbon_cost carbon_price * (carbon_actual - carbon_quota) objective cp.Minimize(fuel_cost storage_cost market_cost carbon_cost) # 约束 constraints [ cp.sum(p_gt, axis0) p_sto p_grid self.load, soc[1:] soc[:-1] self.storage_params[eta] * p_sto * self.dt(), soc[0] self.storage_params[init_soc], soc[T] self.storage_params[final_soc], p_gt 0, p_gt self.gen_data[gt_max], p_grid -self.storage_params[grid_in_max], p_grid self.storage_params[grid_in_max] ] prob cp.Problem(objective, constraints) res prob.solve(solvercp.GUROBI) # 实际用Gurobi或CBC都行 return { status: prob.status, objective: prob.value, p_gt: p_gt.value, p_grid: p_grid.value, p_sto: p_sto.value, carbon_actual: carbon_actual.value }这里有个非常关键的工程细节下层优化返回结果时必须把状态和变量值分开返回并且检查status。实际跑多轮迭代时偶尔会遇到因为数值问题导致求解器返回异常状态的情况如果不加检查异常值会直接污染Kriging训练集后面整个代理模型就烂掉了。我建议在调用下层求解的入口处设置异常兜底一旦下层无解返回一个足够大的惩罚目标值但千万不要把这个点加进Kriging训练集。5.3 上层ACPSO搜索与Kriging代理的调度逻辑上层主循环逻辑可以组织成下面这样一个类class StackelbergSolver: def __init__(self, vpp_list, platform, pso_params, kriging_params): self.vpps vpp_list self.platform platform self.pso_params pso_params self.kriging GaussianProcessRegressor(**kriging_params) self.X_observed [] # 已评估的价格向量 self.y_observed [] # 对应的上层目标值 def evaluate(self, price_vector): # 把price_vector拆给每个VPP转成各VPP的购售电价 buy_prices self.platform.extract_buy_prices(price_vector) sell_prices self.platform.extract_sell_prices(price_vector) vpp_responses [] total_obj 0.0 for i, vpp in enumerate(self.vpps): res vpp.solve_lower( buy_prices[i], sell_prices[i], self.platform.carbon_price, self.platform.carbon_quota[i] ) if res[status] ! optimal: return 1e10 # 惩罚值 vpp_responses.append(res) total_obj self.platform.objective(vpp_responses, buy_prices, sell_prices) return total_obj def run(self): # 初始采样 ini_points self.initial_sampling() for x in ini_points: y self.evaluate(x) self.X_observed.append(x) self.y_observed.append(y) # 迭代加点 for it in range(self.max_iter): self.kriging.fit(self.X_observed, self.y_observed) next_point acpso_search_ei(self.kriging, self.bounds) y_new self.evaluate(next_point) self.X_observed.append(next_point) self.y_observed.append(y_new) if self.check_convergence(): break return self.best_solution()主循环实现不难难的是把价格向量和VPP参数之间的映射关系设计得灵活。上层平台可能根据不同VPP的成本结构设置差异化电价也可能统一价格。推荐在platform.extract_buy_prices这类方法里做统一封装上层搜索的决策变量只是一个标准化向量内部映射规则随便改。5.4 ACPSO中混沌初始化与自适应权重的实现片段ACPSO的实现核心两处混沌初始化和自适应权重调整。def chaotic_init(n_particles, dim, bounds, mu3.9): # 用Logistic混沌映射生成初始位置 x np.zeros((n_particles, dim)) z np.random.rand(dim) for i in range(n_particles): z mu * z * (1 - z) # Logistic映射 x[i] bounds[0] (bounds[1] - bounds[0]) * z return x自适应权重可以这样算def adaptive_weight(population, w_min, w_max): # 用粒子的平均距离衡量多样性 center np.mean(population, axis0) distances np.linalg.norm(population - center, axis1) diversity np.mean(distances) w w_max - (w_max - w_min) * min(diversity / diversity_max, 1.0) return w一个实际调试心得diversity_max不能设得太小否则后期粒子一收敛权重就降到比w_min还低被迫停在局部解附近。我的做法是初始时先跑几代统计平均多样性再把它作为diversity_max的参考值。5.5 数值稳定性与效率优化Kriging建模最常遇到的坑是协方差矩阵条件数过大导致求解过程数值崩溃。轻量解法是给协方差矩阵的对角线加一个小量比如1e-8通过增大正则化项保证矩阵可逆。GaussianProcessRegressor里对应参数是alpha默认值1e-10在双层博弈数据下经常不够用我一般调到1e-6附近。效率方面最耗时的永远是下层VPP优化。几个实测有效的优化手段如果VPP内部没有0-1变量优先选cvxpy 开源求解器比如OSQP或CBC只有在有整数变量时才上Gurobi这类商业求解器对各VPP的下层优化做并行用Python的多进程池把几个VPP的求解分发到多核上整个评估速度可以翻数倍当上层策略变化很小时下层求解的最优解可以当作下一次求解的热启动点能显著减少迭代次数。6. 判定结果质量与实验设计6.1 对比实验该怎么搭这类研究判质量主要看三块求解效率、解的质量、博弈均衡的合理性。效率对比建议做ACPSO-EI-Kriging与普通PSO、遗传算法在下层评估次数上的对比。画一条“目标函数值 vs 评估次数”的收敛曲线注意纵轴用min归一化后的目标值横轴同样归一化不然不同量纲的目标值放一起完全看不出对比效果。解的质量对比要看最终目标值和稳定性。建议每个算法跑20个随机种子统计最终目标值的均值、标准差、最优值和最差值得出箱线图。Kriging代理优化对初始采样点非常敏感多随机种子统计是必须的。6.2 主从博弈均衡结果的分析维度从博奕均衡解里能提取的信息量很大不要只看目标函数值关键是看各VPP的策略变化各VPP购售电量的分配比例燃气机组出力是否因为碳交易机制而明显下调储能充放电行为是否被碳成本影响了碳价从低到高变化时平台的定价策略出现几次分段调整。这些维度分别对应了“多VPP互动是否真实存在”“碳交易机制是否对调度产生了实质影响”“主从博弈均衡是否真的实现了”。有的论文算完只放一个目标值曲线很容易被审稿人质疑模型里主从博弈和碳交易只是摆设。把策略层面的分析补上整个研究会有说服力得多。6.3 后续可以继续扩展的方向这套框架的可扩展性很强如果你后面想继续深入我建议优先考虑两个方向一是随机性建模。风光出力和负荷预测的不确定性用场景法做比如蒙特卡洛抽样生成若干场景让下层VPP的优化目标变成期望成本最小化碳交易部分用机会约束处理——比如要求碳排放在一定置信水平下不超过配额。加随机性后上层Kriging代理的训练数据会出现轻微噪声EI计算时要保留方差估计反而更能发挥Kriging的优势。二是更复杂的博弈结构比如多个平台作为多个领导者竞争VPP选择跟哪个平台签约。这种情况下每个领导者面临的不只是VPP响应还有对手平台的定价策略问题就从单领导者Stackelberg变成多领导者博弈。ACPSO中的粒子可以扩展成“双层嵌套粒子群”外层粒子代表各平台价格内层粒子代表跟随者选择策略计算框架要更复杂但解决问题的思路是一致的。从纯Python工程角度复盘我觉得这套研究中最容易出问题、也最值得花时间去打磨的不是算法本身而是上下层接口的稳定性。你做一次参数调节可能会连续跑几十个小时的仿真如果下层优化偶尔因为数值问题返回异常值整个Kriging训练集被污染前面所有时间和算力都白费了。所以我个人的习惯是在evaluate函数里对所有下层求解结果做校验非最优状态直接返回大惩罚值且不加入训练集同时对每个新加入的样本点都会打印详细的响应记录方便脚本跑崩时回溯是哪一步出了偏差。这种工程上的“笨功夫”恰恰是这类复杂嵌套优化项目能否真正跑出结果的胜负手。
RELATED

相关推荐

无人机充电站设计方案:从供电选型到布点成本全解析

无人机充电站设计方案:从供电选型到布点成本全解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

📅 2026/9/17 2:50:43
具身智能数据采集平台选型指南:开源对接决定上限

具身智能数据采集平台选型指南:开源对接决定上限

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

📅 2026/9/17 2:50:43
easy-vibe 设计稿转代码实战:多模态 AI、Figma/MasterGo 原生能力与 MCP 协议三条路径全解析

easy-vibe 设计稿转代码实战:多模态 AI、Figma/MasterGo 原生能力与 MCP 协议三条路径全解析

easy-vibe 设计稿转代码实战:多模态 AI、Figma/MasterGo 原生能力与 MCP 协议三条路径全解析 【免费下载链接】easy-vibe 💻 vibe coding 101|The first course for AI-native product builders. 项目地址: https://gitcode.com/GitHub_Tre…

📅 2026/9/17 2:50:43
MORE NEWS

更多资讯

📰

PLC通过CANopen控制步进电机:H5U实战配置与调试全记录

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

📰

Warp 修复 `wp.tile_squeeze()` 轴越界校验:拒绝非法 axis 并保留负轴支持

Warp 修复 wp.tile_squeeze() 轴越界校验:拒绝非法 axis 并保留负轴支持 【免费下载链接】warp A Python framework for GPU-accelerated simulation, robotics, and machine learning. 项目地址: https://gitcode.com/GitHub_Trending/warp/warp 本篇技术文…

📰

Python操作MySQL全攻略:连接池、事务与性能优化

前阵子帮一个刚转 Python 后端的朋友梳理项目代码,发现他在业务里每次请求都用 pymysql 重新创建一次数据库连接,高峰期时 MySQL 日志里绝大多数连接状态都是 TIME_WAIT。这种写法在本地跑 demo 感觉不到问题,放到线上,连接数直接…

📰

局域网远程桌面全攻略:从RDP到RustDesk的搭建与排错

局域网远程桌面这件事,听起来简单,真弄起来一堆幺蛾子。我在公司管过机房,自己家里也常年摆着两三台电脑互控,踩过的坑快能写一本小册子了。这篇文章不打算只丢给你一个“工具推荐列表”,而是把局域网里远程桌面能走的…

📰

Java Web毕设实战:Servlet+JSP+MySQL二手车交易系统

简介:本资源是一套完整的Java二手汽车交易平台毕业设计实现方案,面向计算机相关专业本科生及Java初学者,解决毕业设计选题、系统开发与论文撰写一体化需求。项目基于JSP动态网页技术构建,采用Java语言开发,MySQL数据库…

📰

SpringBoot实现企业微信会话存档:跨平台证书加载与AES-SHA256签名实战

简介:本资源是一套基于SpringBoot实现的企业微信会话内容存档完整解决方案,面向Java后端开发者及企业级IM集成工程师,解决企业合规审计场景下会话数据实时拉取、加解密与持久化存储的核心问题。资源包共153个文件,含37个核心Java类…

TODAY

今日更新

THIS WEEK

本周精选

THIS MONTH

本月热门

读完文章,想聊聊您的网站?

告诉我们您的行业与需求,资深顾问一对一梳理方案与报价,全程免费。

📞 💬