1.CLIENT/SERVER 到底是什么?
C/S属于2-TIER系统,适合于中小型应用系统。大系统一般都用3-TIER了。
打个比方单机数据库系统(比如VFP), 相当于前店后库.店里需要什么东西,得自己去库房找,库房管理也是有你自己进行. 而C/S系统下,店和库是相对独立的,有一个专门的库房管理(数据SERVER),店里需要什么,按照手续把单子给
库房管理人员,由他们去操作.
因此可以看出C/S的优点: 支持多用户; 更有效的数据管理,数据安全和可靠得多;远程使用数据.
如果你是单机使用当然没有太大必要使用C/S了.
如果用VFP本身做C/S系统, 效果不是很明显,因为VFP的数据管理功能不是很强,比如加锁解锁都需要程序来操作. 我主要说的是VFP/SQL SERVER系统.
2. SQL SERVER
SQL SERVER是微软发布的RDBMS(关系数据库管理系统), ORACLE, INFOMIX,POWERBUILD,也都是类似的系统. 他们就相当于仓库的管理系统,但功能不仅仅是数据管理. 微软的数据库产品从功能和规模由小到大排列依次是: ACCESS, VFP, SQL SERVER.
稍微大一点的系统,SQL SERVER是需要专人管理的,这就是DBA (DATABASE ADMINISTRATOR)的位置.现在北美人才市场上, DBA的工作比程序员的工作好找些. 工资比普通程序员略高, 工作稳定性也强一些.
SQL SERVER是一套大的软件系统,可以安装在专门的NT数据SERVER上,也有个人版可以安装在WIN95/98上, 主要是为了咱们这些程序员方便测试. 它的功能主要有这么几块: 数据库的管理和维护,用户/安全管理, 数据的发布/转换.
3. 用VFP/SQL SERVER做C/S系统
VFP和SQL SERVER的搭配应该是比较完美的, 但因为VB才是微软的主流产品(VB一直是微软的,FOXPRO是后来才买的,后娘生的), 所以微软从来没有大力推荐或者宣传过VFP, 而是把VFP独有的数据库技术融合到自己的其它产品里了: SQL SERVER, ODBC, OLE DB/ADO. 最近甚至把VFP从VISUAL STUDIO里独立出来了.
VFP和SQL SERVER的交流,可以通过3种方式进行:
A. 远程视图 B. ADO控件 C. SPT (SQL PASS THROUGH)
3种方式各有优缺点, 而我最偏好第3种. 远程视图和ADO都在VFP和SQL SERVER中间加了一个层次, 而这层次就相当于一个黑箱,你不清楚它们到底怎么操作数据的,只需按照它们的规则进行设置,使用
相应的命令就可以. 反正我作为程序员,喜欢清楚地知道我的程序每一步都在干什么,所以我喜欢用SPT, 也从不用向导来建立表单报表一类的.
SPT技术是通过VFP的函数SQLCONNECT()来和SQL SERVER建立连接, 然后用SQLEXEC()函数把要执行的SQL命令 送到SQL SERVER上去执行,
所有对数据的操作都是通过这些SQL命令来进行的. 每一个细节都由自己的代码来控制.
4. VFP数据的升迁
VFP的数据库,可以直接用VFP自带的升迁向导转到SQL SERVER上,但必须把所有的表都放到数据库里,自由表不能直接升迁, 而实际上升迁上去的又只是表,数据库本身不能转到SQL SERVER里. 感觉怪怪的. 也许是为了升迁索引或者关系吧.
要把VFP数据升迁到SQL SERVER上, 必须先在SQL SERVER里建立相应的数据库. SQL SERVER的管理是通过ENTERPRISE MANAGER (EM)来进行的. 通过它建立数据库, 每个数据库里可以包含 数据表,用户/用户群,视图,存储过程等等.
至于改用SQL SERVER后,原来的VFP程序是肯定需要修改的, 而且是比较大的改动.
***************
谈谈VFP和SQL SERVER搭配做C/S系统 (二) --动态设置ODBC连接
1。设置ODBC数据源
VFP和SQL SERVER的连接是通过ODBC或者OLE DB(ADO)来进行的。可以打开控制面板的ODBC数据源进行设置。但很多情况下,我们希望能在程序里动态设置数据源,一来可以不用去为每个用户的机器手动设置, 二来为了数据的安全性,使用完后,希望把ODBC数据源删掉。
下面的例子是用API函数来设置和删除ODBC数据源。
函数名字是 SQLConfigDataSource,其中第二项参数是数字(1-增加 2-修改 3-删除)
DECLARE INTEGER SQLConfigDataSource IN odbccp32 INTEGER, INTEGER, STRING, STRING
lnWindowHandle=0
lcODBCDriver='SQL Server' &&DRIVER类型
lcODBCName='SharedData' &&数据源名字
lcODBCDesc='Shared Data Source' &&数据源描述
lcODBCServer='DEVSQL' &&SQL SERVER名字
lcODBCDatabase='Shared' &&要连接的数据库名字
**先试图修改已有的ODBC,如果不存在,返回0。
lreturn=SQLConfigDataSource(lnWindowHandle, 2, lcODBCDriver, ;
'DSN=' + lcODBCName + CHR(0) ;
+ 'Description=' + lcODBCDesc + CHR(0) ;
+ 'Server=' + lcODBCServer + CHR(0) ;
+ 'Database=' + lcODBCDatabase + CHR(0))
IF lreturn=0 &&不存在
**添加新的ODBC
lreturn=SQLConfigDataSource(lnWindowHandle, 1, lcODBCDriver, ;
'DSN=' + lcODBCName + CHR(0) ;
+ 'Description=' + lcODBCDesc + CHR(0) ;
+ 'Server=' + lcODBCServer + CHR(0) ;
+ 'Database=' + lcODBCDatabase + CHR(0))
IF lreturn=0 &&失败
MessageBox('添加ODBC数据源失败',16,'BUFFER')
ENDIF
ENDIF
2。删除ODBC数据源
**用完后,可以在表单DESTROY事件里删除ODBC。 如果不想重复设置参数,可以把这些参数加到表单作为属性。
DECLARE INTEGER SQLConfigDataSource IN odbccp32 INTEGER, INTEGER, STRING, STRING
lnWindowHandle=0
lcODBCDriver='SQL Server'
lcODBCName='SharedData'
lcODBCDesc='Shared Data Source'
lcODBCServer='DEVSQL'
lcODBCDatabase='Shared'
**先修改,或者其是否存在
lreturn=SQLConfigDataSource(lnWindowHandle, ;
2, lcODBCDriver, ;
'DSN=' + lcODBCName + CHR(0) ;
+ 'Description=' + lcODBCDesc + CHR(0) ;
+ 'Server=' + lcODBCServer + CHR(0) ;
+ 'Database=' + lcODBCDatabase + CHR(0))
IF lreturn=1 &&ODBC存在,删除它
lreturn=SQLConfigDataSource(lnWindowHandle, ;
3, lcODBCDriver, ;
'DSN=' + lcODBCName + CHR(0) ;
+ 'Description=' + lcODBCDesc + CHR(0) ;
+ 'Server=' + lcODBCServer + CHR(0) ;
+ 'Database=' + lcODBCDatabase + CHR(0))
IF lreturn=0
MessageBox('删除ODBC源失败,16,'BUFFER')
ENDIF
ENDIF
**清除DLL
CLEAR DLLS
3. 从VFP连接到SQL SERVER
lnHandle=SQLConnect("SharedData","用户名”,“密码”)
If lnHandle>0 &&连接成功
**从库里获得数据(比如从EMP表里得到部门号为‘01’的职工)
lnReturn=SQLExec(lnHandle,"Select * from Emp Where cDept='01'","CursorEmp")
If lnReturn>0 &&运行成功
Browse
Else &&失败
&&出错处理
EndIf
Else &&连接失败
MessageBox("连接SQL SERVER失败”,16,“BUFFER”)
EndIf
**用完连接后,最好马上关闭,连接是很宝贵的资源,微软是按连接数收费的,而且每个连接会增加SQL SERVER的管理负担
=SQLDisconnect(lnHandle)
***************
(续) (这些贴子必须连着看)
用SPT技术更新数据时,必须通过SQL命令进行,SQL命令必须符合ANSI或者T-SQL(微软的TRANSACTION SQL),因为命令是通过VFP的SQLEXEC()函数送到SQL SERVER去执行的,语法必须遵守SQL SERVER的规则,而不是VFP的规则。不熟悉的人,最容易犯的错误就是把VFP的函数传送到SQL SERVER上执行,结果总出错。两者大部分函数都是不一样的。
比如ALLTRIM()是VFP的, SQL SERVER里是LTRIM()和RTRIM()
VFP日期以{}分界,但SQL SERVER里不认,必须用单引号.
如果SQL命令里用到VFP程序里的变量,变量前必须加问号“?”
比如,更新一个表的字段
lcLName="Zhang"
lcFName="San"
lnReturn=SQLEXEC(连接句柄,“Update Emp Set cLName=?lcName, cFName=?lcFName Where cEmpNo='733000'")
如果返回值lnReturn>0,就更新成功了
插入记录,或者逐条修改记录时,只能每次操作一条记录。
比如要把临时表TmpEmp里的记录加到SQL SERVER的EMP表里,就得用循环
Select TmpEmp
Scan
lnReturn=SQLEXEC(连接句柄,"Insert Into Emp (cEmpNo,cLName,cFName) values (?TmpEmp.cEmpNo,?cTmpEmp.cLName,?cTmpEmp.cFName)"
EndScan
*** 要得到SQL SERVER上某个表的结构,有两种办法,一是运行SQL SERVER自带的系统存储过程。一是运行一个SELECT命令。
比如要从SQL SERVER得到EMP表的结构
lnReturn=SQLEXEC(连接句柄,"Select Top 0 * From Emp","TmpEmp")
返回的结果都是临时表,是只读的,要想变成可读写的,需要做点小变化:
Select 0
Use DBF("TmpEmp") Again Alias Emp
Use In TmpEmp
现在得到的EMP临时表就是可读写的了。
*注 "Select Top 0 From Emp" 命令在VFP里是错误命令,但SQL SERVER里可以执行.
SPT和使用视图相比,优点是每一步你都清楚自己在做什么,知道为什么命令会出错。缺点是你需要多写命令,多了解SQL SERVER的语法。
***************
谈谈VFP和SQL SERVER搭配做C/S系统 (五) --从VFP控制SQL SERVER事务处理和加锁
**建立与SQL SERVER的连接
lnHandle=SQLConnect("ODBC数据源","用户名","密码")
If lnHandle>0
&& 设置成手工事务处理模式,由代码来控制
= SQLSETPROP(lnSQL_Hand, 'Transactions', 2)
**下面的命令从EMPPAY里选取记录,并给该表加上独占锁(TABLELOCKX),一直到该事务结束(HOLDLOCK)
ln1=SQLEXEC(lnHandle, "SELECT * FROM Emppay WITH (TABLOCKX, HOLDLOCK)","Emppay")
**执行其它命令,比如更新数据
ln2=SQLEXEC(lnHandle,"Update PayTotal Set ......")
...
...
**如果所有命令都正确执行了,则
=SQLCOMMIT(lnHandle)
***如果要放弃整个事务处理,用
=SQLROLLBACK(lnHandle)
***关闭连接,事务自动结束,锁也解开
=SQLDISCONNECT(lnHandle)
Else
****连接失败
EndIf
*** SQLSETPROP()函数
这个VFP函数是用来设置当前连接的属性的。 比如上边的手工事务处理。
还有一个比较常用的属性是DISPLOGIN,该属性控制是否显示SQL SERVER的登录表单
第3个参数: 1 - 显示登录表单,如果登录信息(用户名,密码)不完全 2 - 总显示登录表单 3 - 不显示登录表单
例如:
=SQLSETPROP(lnHandle, "DISPLOGIN",1)
当使用SPT技术时,为节约连接数减少服务器负担,需要经常连接和断开SQL SERVER,有时候你并不希望每次连接都让用户登录,当用户首次登录后,可以把名字和密码存起来,以后的连接可以自动登录了。
***************
谈谈VFP和SQL SERVER搭配做C/S系统 (六) -- SQL SERVER的索引
作为VFP程序员,我们深知索引对表的重要性,好的索引可以大大缩短程序读取数据的时间。
索引对于SQL SERVER数据表来说,同样是很重要的。你可以做个简单的测试。
1. 索引测试
从SQL SERVER程序组里或者ENTERPRISE MANAGER的TOOLS菜单上打开QUERY ANALYZER工具.
连接到你的SERVER后, 选择QUERY菜单上的CURRENT CONNECTION OPTIONS(当前连接选项),
把SHOW STATS TIME 和SHOW STATS I/O两个选项打勾,然后点OK. 这两个选项将会告诉你命令的运行时间和读写次数.
如果你的SQL命令里用到多个表,还可以选上QUERY菜单上的SHOW EXECUTION PLAN, 它会告诉你的命令在各各表上所花费的时间.
选一个没有索引的大小适当的表,然后执行一条SELECT命令,你会看到运行时间.
比如我用了表CHQ,有将近40万条记录, 执行下面的命令,返回5000多个记录
select * from Chq where date >='02/01/2001' and date<='02/28/2001'
显示的时间和读写情况:
Table 'chq'. Scan count 1, logical reads 13145, physical reads 0, read-ahead reads 13152.
SQL Server Execution Times: CPU time = 5781 ms, elapsed time = 23526 ms.
然后我在CHQ表上对DATE字段建立索引,再运行相同的SELECT, 得到如下结果:
Table 'chq'. Scan count 1, logical reads 3965, physical reads 14, read-ahead reads 0.
SQL Server Execution Times: CPU time = 704 ms, elapsed time = 6432 ms.
比较两个结果可以看出, 建立索引后,逻辑读写和预读写次数大大减少, 占用CPU时间从5.781秒减少到了0.704秒, 总运行时间从23.526秒减少到6.432秒
如果运行更复杂的命令,效果会更加明显.
2. 了解SQL SERVER的索引
SQL SERVER的数据文件和索引文件都是以页为单位存放的,每页是8K. 相当于把磁盘划分成8K大小的块,以块为单位存放数据.
了解这一点是非常重要的, 它能帮助你理解下面的内容.
SQL SERVER的索引有2大类,
一类是CLUSTERED(物理索引),每个表只能有一个, 记录在磁盘上存放时完全按照物理索引的顺序.
另一类是NONCLUSTERED(逻辑索引), 记录顺序存放在索引表里.
不管是哪类索引,只要能到达目的,索引表达式(包含的字段)越简单越有效.
什么字段作为物理索引最合适?
有两个原则: 一是在根据范围来选择记录时,哪个字段最有效, 二是在往磁盘上写记录是不会引起热点(HOT SPOT).
热点是指,大量读写发生在磁盘的同一区域,引起I/O瓶颈效应,降低运行速度.
我们用例子来看看这些原则怎么用.
假如有个单据表, 包含这些字段: 单据号,单据日期,金额,销售地点,已经其它数据.
哪个适合作为物理索引呢? 一般的想法是用没有重复值的字段(相当于VFP里的主键).
a. 用单据号, 其实这不是恰当的选择. 因为很少有根据单据的范围来选择记录的, 比如你很少用命令来查询单据号大于或者小于某个值的记录. 而且在输入时,也比较容易产生热点, 因为插入的记录一般都加在表尾,当有大量用户同时输入时,会产生热点. 单据号不符合上面的2条原则.
b. 用单据日期, 似乎是个比较适当的选择. 因为经常需要用日期范围来选择记录, 但同样会因为大量用户同时输入最新单据而在磁盘上引起热点.
c. 用销售地点, 这应该是最恰当的物理索引人选了. 因为我们会经常根据地点来选择记录, 而在同一时刻插入的记录也不太可能来自同一个销售地点,避免了热点.
当然,不同的环境下,你的选择可能不同,比如你没有成千上万的用户,就不太需要考虑热点问题. 但要记住, 有唯一值的字段并不是物理索引的最佳选择.
3. 选择适当的FillFactor
在SQL-CREATE INDEX命令里,有个FILLFACTOR选项, 这个选项对索引的效率是有很大作用的.
FILLFACTOR是指建立索引时, 每一页存放数据的填满程度, 比如100%,表示把索引文件每一页都填满,隐含值是0 (100%).
如果你的表经常需要插入记录, 选择适当的FILLFACTOR就很重要了. 如果总是用100%, 当你插入一个新记录时, 由于每页都是满的, 就需要进行分页操作(把当前页分成2页),频繁的分页操作会占用服务器的资源和时间,也降低索引文件的效率. 而如果你的FILLFACTOR不是100%,比如设为80%, 在插入新记录时,由于当前页还有空间, 可以直接加入不需要分页. 当然, FILLFACTOR太低也会降低效率,因为那样的话,页数就多了,搜索数据用的时间长,占用空间也多.
如果是只读表,或者插入记录很少的表,用100% FILLFACTOR最好.
对于经常插入新记录的表,需要定期重建索引, 因为索引文件随着页数的增加, 效率会越来越低. 因为索引都是树状结构, 当下面的页加得没有规律时, 连接就会变乱, 重建索引可以重新整理树状结构.
4. 索引分析工具
在QUERY ANALYZER的QUERY菜单里,还有个选项PERFORM INDEX ANALYSIS.
在输入你的命令后,选择这一项, SQL SERVER会对你的命令进行分析,然后告诉你建立什么样的索引对当前命令最有利.
可以把你程序里常用的命令放到这里进行分析,找出最恰当的索引。
相关推荐
企业级AI平台架构设计:AI应用架构师的未来趋势
企业级AI平台是AI从“实验室”走向“生产线”的关键,而AI应用架构师就是这条“生产线”的总设计师。未来,随着生成式AI、边缘计算、自治式AI的发展,架构师的角色将越来越重要——他们不仅要构建技术平台,还要连接技术与业务,让AI真正创造价值。“不要做‘只会调模型的工程师’,要做‘能解决业务问题的架构师’。因为,真正有价值的AI,从来不是“最先进的模型”,而是“能落地、能复用、能创造业务价值的平台”。愿你在企业AI转型的浪潮中,成为那个“搭建桥梁的人”——连接技术与业务,连接现在与未来。
关于C/S、B/S和Multi_tier结构的解释
C/S:Client/Server的缩写。服务器和客户端,这是在计算机资源比较昂贵时非常受人推崇的一种模式。目前,在企业数据库应用系统中还是一种非常务实的解决方案。客户端安装计算机软件,联机到服务器端,读取业务处理需要的数据,查看其他客户端提交的、权限允许的数据。使得资源得到了共享。这种模式的应用软件运行比较稳定,客户端界面、权限、数据处理等控制比较灵活;缺陷是软件的升级和维护随着客户端的增加而增...
2000-2023年各省资本存量数据-最新出炉.zip
一、资源特点全新力作:今年精心打造,人工细细打磨,品质上乘。权威精准:数据来源,准确靠谱,值得信赖。品质无忧:绝无数据造假,品质有保障,放心使用。二、适用人群学生:在校专科生、本科生、研究生,助力学业各个环节。教研人员:大学教师和学术科研工作者,为教学科研添力。三、适用专业社科经济:经济学、社会学专业适用。规划管理:地理学、城市规划,以及商业、工商管理专业皆可使用。[特别说明]相关资源数据已全部上传至网盘。由于纯手工分享粘贴链接和提取码,不排除有极少提取码或者链接出现差错(或内容与标题对不上),若遇到这种情况,不要着急,请私信博主,将会第一时间更正补链接!
浅析Tier和Layer的区别
有关Tier和Layer的区别,这里详细论述一下,大家共同探讨。 1. 横向与纵向 有一种说法是“Layer是水平方向的,tier是垂直方向的”。这种说法首先容易给人造成下面这样的误解: |||| -- -- -- 其实两者表示起来恰恰相反: |||| -- -- -- 这种说法的确切含义是“Layer是水平方向的,tier是垂直方向
中小企业出海上云:一次服务器选型踩坑记录
这次踩坑的本质,是用单机思维运营海外业务:区域凭地理直觉,弹性当临时动作,规格只看计算资源,安全与售后留到出事后才想。迁移执行:数据迁移走全量导出、增量同步、短停切换三步,先全量逻辑导出导入并核对行数与关键字段,再追增量,两边延迟归零后选低谷窗口把源库置为只读,完成末次增量并切换写流量。两条链路都不稳定,说明问题不在个别运营商,而在区域选址本身。2026 年上半年开始做周期性促销,并接入当地支付网关的订单回传后,流量结构与调用链都变了,单机方案开始连续出问题,于是有了这次从排查、重新选型到迁移落地的记录。
Java开源在线考试系统怎么选?从技术选型到落地部署的完整指南
Java开源在线考试系统怎么选?本文从技术选型、核心功能、部署运维、二次开发等维度,梳理了Java开源在线考试系统的选型要点。
商超智能运营如何落地?从系统架构到实战避坑的完整技术路径
3. **多端交互展示层**:需覆盖顾客使用的**小程序、APP及H5公众号**,以及员工使用的管理后台。答:在应用层引入**适配器模式**。在项目启动时,应强制要求供应商或自研团队产出**部署文档**(含环境变量清单)和**二次开发文档**(含核心流程时序图),确保后续维护不受限于个人。- **多租户插件**:MyBatis Plus的`TenantLineInnerInterceptor`可实现SQL层面的自动拼接`store_id`条件,防止开发者因SQL编写疏漏导致的数据越权。
基于Python的爱奇艺视频数据可视化分析系统
长视频平台剧集、评分、热度与评论数据体量大、维度多,手工汇总难以快速把握类型结构、口碑分布与主演导演影响力。系统采用 B/S 架构,后端入口为app.py,运行端口8060;数据库使用 MySQL(库名iqiyi),经 PyMySQL 访问。前台基于 Bootstrap 5、本地中的 ECharts 5 与 echarts-wordcloud,配合主题。业务表包括usersdramascommentsfavorites。数据可通过导入,或经/ 相关脚本补充样本。分析层在。
Oracle迁移到PostgreSQL数据库-FGOracle2PG工具
FGOracle2PG 是一款高性能、高可靠的 Oracle 数据库到 PostgreSQL 数据库迁移工具。它由风哥基于多年数据库运维与迁移实战经验开发。工具采用纯 Python 实现,支持命令行(CLI)与可视化 Web 控制台两种操作方式,能够覆盖从开发测试到生产环境的全场景数据库迁移需求。
电商推返模式的技术架构与系统落地实践
成功的电商推返模式系统,本质是。
Django的手机数据分析与可视化
Django的手机数据分析与可视化系统 摘 要 本系统基于Django框架、HTML和MySQL数据库技术,构建了一个全面的手机数据分析与可视化平台。大屏内容丰富,包括品牌市场份额分布、手机价格区间分布、各维度评分分布、热门机型Top10、内存容量分布以及品牌评分与价格分析等多个模块。通过这些模块,用户可以直观地了解手机市场的整体趋势、各品牌的市场表现、手机价格分布情况、用户评分分布以及热门机型的详细信息。系统采用了先进的可视化技术,将复杂的数据以图表的形式呈现,使得数据更加易于理解和分析。 在管理功能方
MySQL 數據庫導入
2. 查詢sql語句模式。
Agent状态管理与断点续传:Checkpointer机制深度解析
Checkpointer解决Agent长任务中断后重复执行前半程的痛点:只存游标、版本号、结果引用与幂等键,区别于长期记忆Store与追踪Trace。实现中断→存快照→校验→续跑闭环,靠幂等键兜住副作用。
FastAPI + SQLAlchemy 异步会话(AsyncSession)核心方法
result = await db.execute(select(News).where(...)) # 执行查询,返回 Result 对象。items = result.scalars().all() # 提取 Python 对象列表。await db.refresh(new_news) # 将生成的ID加载到本地对象。await db.commit() # 自动检测到对象变更,生成UPDATE发送。# ① 标记操作(内存中记录,未发SQL)
【基于GO的Web开发21】GORM 更新操作
并且执行模型钩子函数 (Hooks)。如果想跳过钩子,不自动维护。普通 Update / Updates / Save 都会自动更新。,不管字段是否修改,会把结构体所有字段全部更新到数据库。,直接把表达式交给数据库执行,不在 Go 代码做运算。,不会自动更新 UpdatedAt。在钩子函数内部修改数据库列,使用。时间,触发钩子 Hooks。,常用于密码加密等场景。
基于Springboot+Vue的环保行动志愿者招募系统设计与实现(代码+数据库+LW)
摘 要 伴随着社会生态文明建设的不断推进,全民参与环保志愿服务已经成为一种新的社会风尚,传统的线下志愿者招募和管理模式的弊端越来越明显,存在着招募渠道单一、活动信息传播滞后、报名流程繁杂、服务时长统计困难、志愿者缺少线上交流平台、管理统筹效率低等许多问题,不能适应新时代环保公益事业数字化、规范化发展的需要。本文用Spring Boot+Vue前后端分离主流开发技术,MySQL数据库、JWT身份认证、Redis缓存等技术来解决以上问题,设计并开发出一个环保行动志愿者招募系统。 本系统是以志愿者和系统管理员为
RocketMQ订单事务消息实战教学
用户下单要同时扣库存、扣余额、加积分,拆成 MQ 异步履约后,原子性、重复投递、部分成功三大难题怎么破?本文用一个真实可跑的下单案例,讲透 RocketMQ 事务消息(half 消息/本地事务/回查)、三层幂等防线(Redis SETNX + DB 唯一索引 + ▎ 条件更新)、业务失败与消费失败的区分处理、按状态补偿的 Saga 关单逆向流程,以及死信工单 + 人工重放的完整闭环。全量代码含 import、pom 依赖、建表 SQL,附三条可演示链路、生产落地清单与面试题速答,跟着做即可复现。
【好靶场】SQL 注入-字符型
本题表面上是一个按姓名查询数据的功能,真正的难点并不在于记住最后一条 Payload,而在于正确判断用户输入在后端 SQL 中所处的位置。SELECT * FROM users WHERE (name = '$用户可控输入')外层括号:(...)字符串单引号:'...'因此,直接提交普通单引号时,往往只能破坏字符串边界,却没有处理外层括号;最终 SQL 仍然可能因为括号不匹配而报错。'):闭合原 SQL 中包裹姓名值的单引号;:闭合原 SQL 中包裹name = ...的外层括号。
docker
本文围绕 Docker 完整部署实践展开,覆盖基础操作、Dockerfile 镜像制作、镜像体积优化、Registry 私有仓库搭建全流程。 1. **Docker 基础操作**:梳理 Docker 常用基础命令,讲解应用堆栈部署方式,掌握容器日常管理与业务应用部署。 2. **Dockerfile 镜像构建**:讲解 Dockerfile 核心概念,罗列构建镜像常用指令参数,结合实例演示镜像编写流程。 3. **镜像瘦身优化**:从缩减镜像层数、多阶段构建、选用轻量基础镜像三个方案,实现镜像体积精简,提
Helm 下篇:手写 Chart —— 从模板到生产实践
上篇我会用现成的 Chart 装、升、回滚了。但说实话,那感觉像"会用 npm install 但没写过 package.json"。真正要用好 Helm,得自己会写 Chart。这篇把我从"会装"到"会写"的过程记下来,顺便把几个之前含糊的机制彻底抠清楚。
【架构设计】2.9 系统性能
本文主要是对架构师考试大纲中的 第2章 计算机系统基础知识之 《2.9 系统性能》知识点进行整理,主要包括计算机系统性能指标分类、常见的性能指标;性能指标评价方法、阿姆达尔定律。其中,性能评价方法主要对应用最广泛的基准程序法进行整理。本文对计算机相关知识进行详细归纳,对相关同学有一定帮助。
957




被折叠的 条评论
为什么被折叠?



