web和数据库怎么连接
```html 你打开一个网页,点击“登录”,库连服务器在几毫秒内查到了你的数据账号密码,然后告诉你“欢迎回来”。库连这背后就是数据 web 和数据库在对话。但很多人第一次写后端代码时,库连会卡在一个很实际的数据问题上:我的 PHP / Python / Node.js 代码,到底怎么跟 MySQL 或者 PostgreSQL 说上话?库连 答案比你想象的直接:web 应用通过数据库驱动(driver)或连接池,使用数据库协议(比如 MySQL 的数据二进制协议)建立 TCP 连接,然后发送 SQL 语句、库连接收结果集。数据没有魔法,库连也不是数据什么黑科技。但细节里藏着不少坑。库连 我最早接触的数据是 PHP + MySQL。那时候用 连接建立之后,web 代码并不会直接“操作数据库文件”。它把 SQL 字符串发给数据库服务,数据库自己解析、执行、返回。比如: 数据库返回一个结果集,web 代码再把它转成 JSON 或者 HTML。整个过程里,web 只负责“说”,数据库负责“做”。 但每次请求都新建一个连接,开销很大。TCP 三次握手、数据库认证、分配内存……一个高并发网站如果这么干,数据库早挂了。所以真实项目里用连接池。连接池维护一堆已经建好的连接,web 线程/进程从池子里借一个,用完还回去。Java 的 HikariCP、Node 的 另一个容易忽略的点:数据库连接是有状态的。 比如你开了事务, 那 web 和数据库之间要不要加一层?比如 ORM。ORM 把表映射成对象,你写 还有安全。直接把用户输入拼进 SQL,等于把数据库大门敞开。 最后说一个实际案例。我参与过一个日活 10 万的 Node.js 服务,数据库是 PostgreSQL。连接池配置 总结?不,就一句:web 和数据库的连接,本质是进程间通信加连接复用。理解 TCP、连接池、事务状态、参数化查询,你就能避开 90% 的坑。 剩下的 10%,靠看数据库的慢日志和连接数监控。mysql_connect(),一行代码就能连上,简单到让人怀疑人生。后来换成 mysqli 或者 PDO,多了预处理语句、异常处理,但核心没变:你的 web 进程(比如 PHP-FPM 或 Node 进程)作为客户端,数据库作为服务端,两者之间走的是 TCP 或 Unix socket。本机开发常用 socket,线上一般走 TCP,端口 3306 或 5432。SELECT id, username FROM users WHERE email = 'a@b.com';generic-pool、Python 的 SQLAlchemy 自带池,都是干这个的。pymysql 每次请求都 connect(),本地测试没问题,一上生产,并发 50 就报 “too many connections”。后来换成 DBUtils 的 PooledDB,问题消失。连接池不是可选,是必须。 BEGIN 之后必须 COMMIT 或 ROLLBACK,否则这个连接会一直占着锁。连接池回收连接时,如果没重置状态,下一个请求可能莫名其妙读到脏数据。所以好的连接池会做 reset,或者你手动确保事务闭环。User.find({ email: 'a@b.com' }),它帮你生成 SQL。方便,但性能可能打折。我见过一个项目用 Django ORM 做复杂报表,N+1 查询把数据库 CPU 跑满。后来改成原生 SQL,直接降了 70% 的负载。所以 ORM 是工具,不是信仰。' OR '1'='1 这种老把戏至今还能打穿一些系统。用参数化查询(prepared statement)是底线。PDO、JDBC、psycopg2 都支持,别偷懒。max: 20,但每个查询平均耗时 50ms,QPS 峰值 800。算一下:800 * 0.05 = 40 个并发连接需求,池子只有 20,请求开始排队。后来把池子调到 60,同时优化了慢查询,才稳住。所以连接数不是越大越好,要结合查询耗时和并发量算。
-
上一篇
-
下一篇