我希望在Ruust代码中使用surrealdb,而不需要静态mut(不安全代码),也不需要为所有内容创建新的连接.例如,使用静态静音:

static mut db: Option<Surreal> = None

#[tokio::main]
async fn main() {
  unsafe {db = Surreal::new("0.0.0.0:8080")}
  unsafe { db.as_ref() }.get("user", "whynotdogie")
  unsafe { db.as_ref() }.create::<User>("nothendev")
}

而每一次的联系都不言而喻.有没有办法在不使用不安全代码或每次都创建新连接的情况下做到这一点?

我try 了静态静音,但我需要不安全的,我每次都try 连接,但我认为这不是很好的性能,我认为它使用了很多带宽.

推荐答案

Do not write this code.它是highly个单调的,very个危险的.如果您是need,那么可以考虑使用类似于Once cell的全局可见状态.如果你想从不同的线程中改变你的类型,别忘了把它包装在某种同步原语中,比如Mutex.

例如:

use std::sync::Mutex;
use once_cell::sync::Lazy;

static GLOBAL_CONNECTION: Lazy<Mutex<Surreal>> = Lazy::new(|| {
    let db = Surreal::new("0.0.0.0:8080");
    Mutex::new(db)
});

fn main() {
    // Use here db
    GLOBAL_CONNECTION.lock().unwrap()...
}

这将在您第一次使用它时初始化GLOBAL_CONNECTION,之后您将能够访问它.

但是,考虑采用更简单、更惯用的方法,将数据库连接作为程序状态的一部分进行传递.例如

use std::sync::{Arc, Mutex};

fn main() {
    let connection = Arc::new(Mutex::new(Surreal::new("0.0.0.0:8080")));

    // pass this to functions that need db connection
}

Database相关问答推荐

如何限制报表中返回的行数?

在Prisma中建立关系

mysql数据库自动分区

sql-dump 有什么用?

如何将 Grails 3.0 连接到我的本地 Mysql 数据库

将光标中找到的值输出到logcat?

Zend 框架 - 为什么我应该使用数据映射器/Db_Table_Row?

如何在 Products 表的主键和自然键之间做出决定?

MySQL 中的多个 OR 子句

如何在 MSSQL 2005 中创建递归查询?

我如何知道何时索引列以及使用什么索引?

如何使用 MySQL Workbench 更改字段的值?

如何从 Django 中的 sql 模式生成数据模型?

JPA:处理 OptimisticLockException 的模式

找不到类型或命名空间名称SQLConnection

使用多个数据库模式的 JPA

如何删除除了postgres中的少数数据库之外的所有数据库

将内存数据库保存到磁盘

查询以查找列的 nᵗʰ 最大值

PostgreSQL 的 EXPLAIN ANALYZE 的 MySQL 类似功能是什么