可以做哪些网站微信小程序开发网站

张小明 2026/1/10 12:02:34
可以做哪些网站,微信小程序开发网站,企业网站推广的目的,涞水住房和城乡建设厅网站前言 刚工作那会儿#xff0c;遇到过一个诡异的问题#xff1a;服务刚启动时第一批请求特别慢#xff0c;好几秒才响应#xff0c;之后就正常了。 查了半天发现是数据库连接的锅——每次请求都新建连接#xff0c;TCP握手 MySQL认证#xff0c;一套下来几百毫秒。用上连…前言刚工作那会儿遇到过一个诡异的问题服务刚启动时第一批请求特别慢好几秒才响应之后就正常了。查了半天发现是数据库连接的锅——每次请求都新建连接TCP握手 MySQL认证一套下来几百毫秒。用上连接池后响应时间从秒级降到毫秒级。连接池这东西平时不出问题感觉不到它的存在一出问题就是大麻烦。这篇文章讲清楚原理和调优让你以后遇到问题能快速定位。为什么需要连接池创建连接的代价数据库连接不是直接就能用的要经过客户端 数据库 | | |------- SYN --------- | |------ SYN-ACK ------ | TCP三次握手 |------- ACK --------- | | | |---- 认证请求 -------- | |--- 认证Challenge ---- | MySQL认证 |---- 认证响应 -------- | |--- 认证OK ---------- | | |一次连接建立最少也要几十毫秒局域网跨机房可能几百毫秒。如果每次查询都新建连接// 不用连接池千万别这样写publicUsergetUser(intid){ConnectionconnDriverManager.getConnection(url,user,password);// 每次新建try{PreparedStatementpsconn.prepareStatement(SELECT * FROM user WHERE id ?);ps.setInt(1,id);ResultSetrsps.executeQuery();// ...}finally{conn.close();// 用完就关}}假设100 QPS每个连接建立耗时50ms光建连接就得5秒。连接池的作用连接池预先创建好一批连接要用的时候借出去用完还回来-------------------- | 连接池 | | ---- ---- | | |conn| |conn| ... | - 空闲连接 | ---- ---- | -------------------- ^ | | v 还回 借出 ^ | | v -------------------- | 应用代码 | --------------------好处避免重复建连接几十毫秒 → 微秒级控制连接数量防止撑爆数据库连接复用一个连接可以被多个请求复用连接池核心原理核心数据结构一个连接池至少要有这些东西classSimpleConnectionPool{// 空闲连接队列privateQueueConnectionidleConnectionsnewLinkedList();// 正在使用的连接privateSetConnectionactiveConnectionsnewHashSet();// 最大连接数privateintmaxPoolSize10;// 等待获取连接的线程privateObjectlocknewObject();}获取连接的流程publicConnectiongetConnection(longtimeout){synchronized(lock){longdeadlineSystem.currentTimeMillis()timeout;while(true){// 1. 有空闲连接直接返回if(!idleConnections.isEmpty()){ConnectionconnidleConnections.poll();activeConnections.add(conn);returnconn;}// 2. 没达到最大数创建新连接if(activeConnections.size()maxPoolSize){ConnectionconncreateNewConnection();activeConnections.add(conn);returnconn;}// 3. 等待其他线程归还longwaitTimedeadline-System.currentTimeMillis();if(waitTime0){thrownewSQLException(获取连接超时);}lock.wait(waitTime);}}}归还连接publicvoidreturnConnection(Connectionconn){synchronized(lock){activeConnections.remove(conn);// 检查连接是否还有效if(isValid(conn)){idleConnections.offer(conn);}else{conn.close();// 坏了就丢掉}lock.notifyAll();// 唤醒等待的线程}}连接有效性检测连接可能因为各种原因失效数据库重启网络中断连接超时被踢所以借出前要检测privatebooleanisValid(Connectionconn){try{// 方式1发送轻量查询Statementstmtconn.createStatement();stmt.execute(SELECT 1);returntrue;}catch(SQLExceptione){returnfalse;}}HikariCP最快的连接池HikariCP是目前最快的Java连接池SpringBoot 2.x默认用它。为什么HikariCP快字节码优化用Javassist动态生成代理类比反射快无锁设计用CAS代替synchronized减少线程阻塞FastList自定义的List实现针对连接池场景优化精简代码整个核心代码只有几千行基本配置# application.ymlspring:datasource:hikari:# 连接池大小minimum-idle:5# 最小空闲连接maximum-pool-size:20# 最大连接数# 超时设置connection-timeout:30000# 获取连接超时毫秒idle-timeout:600000# 空闲连接超时毫秒max-lifetime:1800000# 连接最大存活时间毫秒# 连接检测connection-test-query:SELECT 1连接池大小怎么设这是最常被问的问题。官方有个公式连接数 (核心数 * 2) 有效磁盘数但实际情况要复杂得多建议从小开始逐步调整# 一般Web应用 最大连接数 CPU核数 * 2 ~ 4 # 例如8核服务器 maximum-pool-size: 20 minimum-idle: 5为什么不是越大越好连接数太多 ├── 数据库连接数有限MySQL默认151 ├── 每个连接都占内存MySQL每连接约1MB ├── 更多连接 更多上下文切换 └── 锁竞争更激烈经验法则宁可排队等连接不要撑爆数据库。超时参数详解hikari:# 获取连接最多等30秒connection-timeout:30000# 空闲连接超过10分钟就关闭# 注意要小于数据库的wait_timeoutidle-timeout:600000# 连接最多存活30分钟然后强制关闭重建# 防止连接时间太长出问题max-lifetime:1800000关键点max-lifetime必须比数据库的wait_timeout小几分钟-- 查看MySQL的wait_timeoutSHOWVARIABLESLIKEwait_timeout;-- 默认28800秒8小时如果max-lifetime wait_timeout数据库会先把连接断掉连接池不知道就会拿到死连接。监控指标HikariCP暴露了很多指标配合Prometheus很好用// 开启指标HikariConfigconfignewHikariConfig();config.setMetricRegistry(newPrometheusMeterRegistry(...));关键指标# 活跃连接数 hikaricp_connections_active # 空闲连接数 hikaricp_connections_idle # 等待获取连接的线程数 hikaricp_connections_pending # 获取连接耗时 hikaricp_connections_acquire_seconds告警规则groups:-name:hikari-alertsrules:-alert:ConnectionPoolExhaustedexpr:hikaricp_connections_pending0for:1mannotations:summary:连接池耗尽有线程在等待-alert:ConnectionAcquireSlowexpr:hikaricp_connections_acquire_seconds_max1for:5mannotations:summary:获取连接超过1秒常见问题排查问题1Connection is not availableHikariPool-1 - Connection is not available, request timed out after 30000ms原因连接池满了30秒内没拿到连接。排查-- 看数据库实际连接数SHOWSTATUSLIKEThreads_connected;-- 看连接来源SELECT*FROMinformation_schema.processlist;可能原因连接池太小有慢查询占着连接不放连接泄漏借出去没还问题2连接泄漏连接借出去忘了还池子里的连接越来越少。HikariCP有泄漏检测hikari:leak-detection-threshold:60000# 连接借出超过60秒就报警日志会显示借出连接的堆栈定位泄漏代码ProxyLeakTask - Connection leak detection triggered for conn0 at com.example.UserService.getUser(UserService.java:42) at ...问题3连接被数据库断开Communications link failure The last packet successfully received from the server was xxx milliseconds ago原因连接闲置太久被数据库踢了。解决hikari:# 定期发心跳保活keepalive-time:30000# 每30秒发一次心跳# 或者让连接在数据库踢之前主动关闭max-lifetime:1700000# 小于wait_timeout问题4启动时连接失败服务启动时数据库还没好连接失败hikari:# 初始化时允许失败initialization-fail-timeout:-1# 慢慢重试connection-timeout:30000或者用优雅启动等数据库好了再接入流量。多数据源配置实际项目经常要连多个库ConfigurationpublicclassDataSourceConfig{BeanPrimaryConfigurationProperties(spring.datasource.primary.hikari)publicDataSourceprimaryDataSource(){returnDataSourceBuilder.create().type(HikariDataSource.class).build();}BeanConfigurationProperties(spring.datasource.secondary.hikari)publicDataSourcesecondaryDataSource(){returnDataSourceBuilder.create().type(HikariDataSource.class).build();}}spring:datasource:primary:hikari:jdbc-url:jdbc:mysql://master:3306/dbmaximum-pool-size:20secondary:hikari:jdbc-url:jdbc:mysql://slave:3306/dbmaximum-pool-size:10读写分离publicclassRoutingDataSourceextendsAbstractRoutingDataSource{OverrideprotectedObjectdetermineCurrentLookupKey(){returnTransactionSynchronizationManager.isCurrentTransactionReadOnly()?slave:master;}}生产经验经验1监控先行上线前先把监控加上。连接池问题往往是间歇性的没监控数据很难定位。经验2压测确定参数不同业务对连接池需求不同。用压测工具JMeter、wrk在真实负载下调整参数。经验3分环境配置# 开发环境spring:profiles:devdatasource:hikari:maximum-pool-size:5# 生产环境spring:profiles:proddatasource:hikari:maximum-pool-size:30经验4多机房注意网络我们有跨机房数据库访问的场景连接建立延迟高。这种情况下适当增大connection-timeout用更激进的预热策略我们用星空组网把两边网络打通后延迟稳定很多总结连接池的核心就三件事功能配置项建议值池大小maximum-pool-sizeCPU核数 * 2 ~ 4超时控制connection-timeout30秒连接存活max-lifetime 数据库wait_timeout记住几个原则连接数不是越多越好够用就行监控比调参重要先能看到问题连接泄漏是大忌用框架自动管理超时要协调连接池和数据库要配合连接池配好了是透明的配不好就是定时炸弹。希望这篇文章能帮你理解原理遇到问题时知道往哪个方向排查。
版权声明:本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!

如何做网站301重定向wordpress搬家乱码

博主介绍:✌️码农一枚 ,专注于大学生项目实战开发、讲解和毕业🚢文撰写修改等。全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围:&am…

张小明 2025/12/31 12:26:42 网站建设

泰州网站制作平台网站域名的建立

Python生物信息学进阶指南:从数据分析到科学发现的技能跃迁 【免费下载链接】Bioinformatics-with-Python-Cookbook-Second-Edition 项目地址: https://gitcode.com/gh_mirrors/bi/Bioinformatics-with-Python-Cookbook-Second-Edition 面对基因组时代的海量…

张小明 2025/12/31 14:02:02 网站建设

建网站培训班网站视图错位

第一章:为什么顶尖团队都在用Open-AutoGLM做日志分析?真相令人震惊在现代分布式系统中,日志数据呈指数级增长,传统日志分析工具已难以应对复杂语义解析与实时异常检测的需求。而顶尖技术团队纷纷转向使用 Open-AutoGLM —— 一款融…

张小明 2025/12/31 14:01:59 网站建设

帮建网站广州哪里有做网站的

有需要的同学,源代码和配套文档领取,加文章最下方的名片哦 一、项目演示 项目演示视频 二、资料介绍 完整源代码(前后端源代码SQL脚本)配套文档(LWPPT开题报告)远程调试控屏包运行 三、技术介绍 Java…

张小明 2025/12/31 13:18:27 网站建设

网站搭建的如何设立网站

IAR实战进阶:手把手教你搞定Flash烧录配置你有没有遇到过这样的场景?代码编译通过,调试器也连上了,结果一点“下载”按钮——弹窗报错:“Failed to program sector”、“Target not responding”……反复检查硬件连接、…

张小明 2026/1/9 9:00:44 网站建设

做投资要关注哪些网站卡片形式的网站

快速体验 打开 InsCode(快马)平台 https://www.inscode.net输入框内输入如下内容: 制作交互式新手教学模块:1. 硬件知识图解百科 2. 装机风险提示(兼容性/功耗等)3. 虚拟装机模拟器 4. 实时在线答疑机器人 5. 生成个性化学习报告…

张小明 2026/1/2 3:29:22 网站建设