news 2026/10/3 12:43:55

sea-orm如何用连接池

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
sea-orm如何用连接池

Sea-ORM本身自带连接池,你调用:

Database::connect(url).await

返回的DatabaseConnection内部就是一个连接池,不需要你自己再包一层Pool。

1. 基础用法

use sea_orm::{Database, DatabaseConnection, DbErr}; pub async fn get_db_conn() -> Result<DatabaseConnection, DbErr> { let url = "mysql://root:root@127.0.0.1:3306/test"; let db = Database::connect(url).await?; Ok(db) }

后续查询时:

let db = get_db_conn().await?; let users = t_sys_user::Entity::find() .all(&db) .await?;

每次查询时,Sea-ORM 会自动从内部连接池中获取连接、执行 SQL、再归还连接。


2. 自定义连接池参数

如果你想配置最大连接数、超时、空闲时间等,用ConnectOptions:

use sea_orm::{ConnectOptions, Database, DatabaseConnection, DbErr}; use std::time::Duration; pub async fn get_db_conn() -> Result<DatabaseConnection, DbErr> { let url = "mysql://root:root@127.0.0.1:3306/test"; let mut opt = ConnectOptions::new(url); opt.max_connections(20) .min_connections(5) .connect_timeout(Duration::from_secs(5)) .acquire_timeout(Duration::from_secs(5)) .idle_timeout(Duration::from_secs(30)) .max_lifetime(Duration::from_secs(60 * 30)) .sqlx_logging(true); let db = Database::connect(opt).await?; Ok(db) }

常用参数:

参数作用
max_connections连接池最大连接数
min_connections连接池最小连接数
connect_timeout建立连接超时
acquire_timeout从连接池获取连接超时
idle_timeout空闲连接关闭时间
max_lifetime单个连接最大存活时间
sqlx_logging是否打印 SQL 日志

3. 全局共享连接池

一般不要把DatabaseConnection每次都重新connect,建议初始化一次,然后全局共享。

方式一:OnceCell
use once_cell::sync::OnceCell; use sea_orm::{ConnectOptions, Database, DatabaseConnection, DbErr}; use std::time::Duration; static DB: OnceCell<DatabaseConnection> = OnceCell::new(); pub async fn init_db() -> Result<(), DbErr> { let url = "mysql://root:root@127.0.0.1:3306/test"; let mut opt = ConnectOptions::new(url); opt.max_connections(20) .min_connections(5) .connect_timeout(Duration::from_secs(5)) .acquire_timeout(Duration::from_secs(5)); let db = Database::connect(opt).await?; DB.set(db).map_err(|_| DbErr::Custom("数据库已初始化".into()))?; Ok(()) } pub fn get_db() -> &'static DatabaseConnection { DB.get().expect("数据库未初始化,请先调用 init_db()") }

使用:

#[tokio::main] async fn main() { init_db().await.unwrap(); let db = get_db(); let users = t_sys_user::Entity::find() .all(db) .await .unwrap(); println!("{users:?}"); }

方式二:tokio::sync::OnceCell

如果你希望延迟初始化,并且第一次使用时才异步创建连接池:

use sea_orm::{ConnectOptions, Database, DatabaseConnection, DbErr}; use std::time::Duration; use tokio::sync::OnceCell; static DB: OnceCell<DatabaseConnection> = OnceCell::const_new(); pub async fn get_db() -> Result<&'static DatabaseConnection, DbErr> { DB.get_or_try_init(|| async { let url = "mysql://root:root@127.0.0.1:3306/test"; let mut opt = ConnectOptions::new(url); opt.max_connections(20) .min_connections(5) .connect_timeout(Duration::from_secs(5)) .acquire_timeout(Duration::from_secs(5)); Database::connect(opt).await }) .await }

使用:

let db = get_db().await?; let users = t_sys_user::Entity::find() .all(db) .await?;

4. 推荐写法

如果你的项目是 Actix Web / Axum 这类异步服务,推荐这样设计:

pub mod database { use sea_orm::{ConnectOptions, Database, DatabaseConnection, DbErr}; use std::time::Duration; use tokio::sync::OnceCell; static DB: OnceCell<DatabaseConnection> = OnceCell::const_new(); pub async fn init_db() -> Result<(), DbErr> { let url = std::env::var("DATABASE_URL") .unwrap_or_else(|_| "mysql://root:root@127.0.0.1:3306/test".into()); let mut opt = ConnectOptions::new(url); opt.max_connections(20) .min_connections(5) .connect_timeout(Duration::from_secs(5)) .acquire_timeout(Duration::from_secs(5)) .idle_timeout(Duration::from_secs(30)) .max_lifetime(Duration::from_secs(60 * 30)) .sqlx_logging(true); let db = Database::connect(opt).await?; DB.set(db).map_err(|_| DbErr::Custom("数据库重复初始化".into()))?; Ok(()) } pub fn get_db() -> &'static DatabaseConnection { DB.get().expect("数据库未初始化") } }

启动时:

database::init_db().await.unwrap();

业务代码里:

let db = database::get_db(); let user = t_sys_user::Entity::find() .one(db) .await?;

关键点

  • DatabaseConnection不是单个连接,而是连接池。
  • 不要在每次请求里都Database::connect。
  • 推荐程序启动时初始化一次,然后全局复用。
  • 如果需要自定义连接池大小、超时,使用ConnectOptions。
  • 全局变量推荐用OnceCell或tokio::sync::OnceCell。

需要我把连接池方案和之前的 Au

Sea-ORM本身自带连接池,你调用:

Database::connect(url).await

返回的DatabaseConnection内部就是一个连接池,不需要你自己再包一层Pool。

1. 基础用法

use sea_orm::{Database, DatabaseConnection, DbErr}; pub async fn get_db_conn() -> Result<DatabaseConnection, DbErr> { let url = "mysql://root:root@127.0.0.1:3306/test"; let db = Database::connect(url).await?; Ok(db) }

后续查询时:

let db = get_db_conn().await?; let users = t_sys_user::Entity::find() .all(&db) .await?;

每次查询时,Sea-ORM 会自动从内部连接池中获取连接、执行 SQL、再归还连接。


2. 自定义连接池参数

如果你想配置最大连接数、超时、空闲时间等,用ConnectOptions:

use sea_orm::{ConnectOptions, Database, DatabaseConnection, DbErr}; use std::time::Duration; pub async fn get_db_conn() -> Result<DatabaseConnection, DbErr> { let url = "mysql://root:root@127.0.0.1:3306/test"; let mut opt = ConnectOptions::new(url); opt.max_connections(20) .min_connections(5) .connect_timeout(Duration::from_secs(5)) .acquire_timeout(Duration::from_secs(5)) .idle_timeout(Duration::from_secs(30)) .max_lifetime(Duration::from_secs(60 * 30)) .sqlx_logging(true); let db = Database::connect(opt).await?; Ok(db) }

常用参数:

参数作用
max_connections连接池最大连接数
min_connections连接池最小连接数
connect_timeout建立连接超时
acquire_timeout从连接池获取连接超时
idle_timeout空闲连接关闭时间
max_lifetime单个连接最大存活时间
sqlx_logging是否打印 SQL 日志

3. 全局共享连接池

一般不要把DatabaseConnection每次都重新connect,建议初始化一次,然后全局共享。

方式一:OnceCell
use once_cell::sync::OnceCell; use sea_orm::{ConnectOptions, Database, DatabaseConnection, DbErr}; use std::time::Duration; static DB: OnceCell<DatabaseConnection> = OnceCell::new(); pub async fn init_db() -> Result<(), DbErr> { let url = "mysql://root:root@127.0.0.1:3306/test"; let mut opt = ConnectOptions::new(url); opt.max_connections(20) .min_connections(5) .connect_timeout(Duration::from_secs(5)) .acquire_timeout(Duration::from_secs(5)); let db = Database::connect(opt).await?; DB.set(db).map_err(|_| DbErr::Custom("数据库已初始化".into()))?; Ok(()) } pub fn get_db() -> &'static DatabaseConnection { DB.get().expect("数据库未初始化,请先调用 init_db()") }

使用:

#[tokio::main] async fn main() { init_db().await.unwrap(); let db = get_db(); let users = t_sys_user::Entity::find() .all(db) .await .unwrap(); println!("{users:?}"); }

方式二:tokio::sync::OnceCell

如果你希望延迟初始化,并且第一次使用时才异步创建连接池:

use sea_orm::{ConnectOptions, Database, DatabaseConnection, DbErr}; use std::time::Duration; use tokio::sync::OnceCell; static DB: OnceCell<DatabaseConnection> = OnceCell::const_new(); pub async fn get_db() -> Result<&'static DatabaseConnection, DbErr> { DB.get_or_try_init(|| async { let url = "mysql://root:root@127.0.0.1:3306/test"; let mut opt = ConnectOptions::new(url); opt.max_connections(20) .min_connections(5) .connect_timeout(Duration::from_secs(5)) .acquire_timeout(Duration::from_secs(5)); Database::connect(opt).await }) .await }

使用:

let db = get_db().await?; let users = t_sys_user::Entity::find() .all(db) .await?;

4. 推荐写法

如果你的项目是 Actix Web / Axum 这类异步服务,推荐这样设计:

pub mod database { use sea_orm::{ConnectOptions, Database, DatabaseConnection, DbErr}; use std::time::Duration; use tokio::sync::OnceCell; static DB: OnceCell<DatabaseConnection> = OnceCell::const_new(); pub async fn init_db() -> Result<(), DbErr> { let url = std::env::var("DATABASE_URL") .unwrap_or_else(|_| "mysql://root:root@127.0.0.1:3306/test".into()); let mut opt = ConnectOptions::new(url); opt.max_connections(20) .min_connections(5) .connect_timeout(Duration::from_secs(5)) .acquire_timeout(Duration::from_secs(5)) .idle_timeout(Duration::from_secs(30)) .max_lifetime(Duration::from_secs(60 * 30)) .sqlx_logging(true); let db = Database::connect(opt).await?; DB.set(db).map_err(|_| DbErr::Custom("数据库重复初始化".into()))?; Ok(()) } pub fn get_db() -> &'static DatabaseConnection { DB.get().expect("数据库未初始化") } }

启动时:

database::init_db().await.unwrap();

业务代码里:

let db = database::get_db(); let user = t_sys_user::Entity::find() .one(db) .await?;

关键点

  • DatabaseConnection不是单个连接,而是连接池。
  • 不要在每次请求里都Database::connect。
  • 推荐程序启动时初始化一次,然后全局复用。
  • 如果需要自定义连接池大小、超时,使用ConnectOptions。
  • 全局变量推荐用OnceCell或tokio::sync::OnceCell。

需要我把连接池方案和之前的 Auth Middleware 整合成一份完整的 Cargo.toml 依赖清单吗?

th Middleware 整合成一份完整的 Cargo.toml 依赖清单吗?

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/10/3 12:43:19

AI 时代真正稀缺的,不只是 Token,而是高价值注意力

AI 时代真正稀缺的&#xff0c;不只是 Token&#xff0c;而是高价值注意力 关于 AI&#xff0c;一个很常见的判断是&#xff1a; 模型越来越强&#xff0c;很多岗位最终就不需要人了。 这个判断有一定道理&#xff0c;但如果只看“AI 能不能完成任务”&#xff0c;其实漏掉了生…

作者头像 李华
网站建设 2026/10/3 12:43:03

毕设开源 深度学习安全帽佩戴检测系统

1 前言 今天学长向大家介绍一个机器视觉的毕设项目&#xff0c;深度学习安全帽佩戴检测系统 项目运行效果&#xff1a; 毕业设计 深度学习安全帽佩戴检测系统&#x1f9ff;项目分享&#xff1a;见主页任意置顶文章 1 课题背景 建筑工人头部伤害是造成建筑伤亡事故的重要原因…

作者头像 李华
网站建设 2026/10/3 12:41:25

被忽略的细节:Amicro use-reduced-motion无障碍动效适配最佳实践

被忽略的细节&#xff1a;Amicro use-reduced-motion无障碍动效适配最佳实践 【免费下载链接】Amicro--Micro-transitions- 项目地址: https://gitcode.com/gh_mirrors/am/Amicro--Micro-transitions- Amicro 是一个基于 Motion 的 React 微交互与过渡动效组件库&#…

作者头像 李华
网站建设 2026/10/3 12:40:24

C与Linux的纽带:Coursebook带你理解系统调用原理的完整指南

C与Linux的纽带&#xff1a;Coursebook带你理解系统调用原理的完整指南 【免费下载链接】coursebook Open Source Introductory Systems Programming Textbook for the University of Illinois 项目地址: https://gitcode.com/GitHub_Trending/co/coursebook 你是否好奇…

作者头像 李华
网站建设 2026/10/3 12:39:05

三层防火墙排查:Nginx 配好了浏览器还打不开

现象 Nginx 配置写好了&#xff0c;nginx -t 也通过了&#xff0c;systemctl reload nginx 没报错。 但浏览器访问&#xff0c;就是打不开。 Chrome&#xff1a;ERR_CONNECTION_CLOSED curl&#xff1a;Connection timed out Nginx 日志里什么都没有——请求根本没到 Nginx。 原…

作者头像 李华