172 похожих чатов

Какое решение будет лучше: Каждый раз в хенделере актикса подавать pool

с соединениями. Не нравится тем, что засоряет сигнатуру функции.
#[get("api/users")]
pub async fn get_user(user_info: Json<UserInfo>, pool: Data<PgPool>) -> ResultJson<User> {
let result = users_service::get_user(user_info.0, &mut acquire_conn!(pool)).await;
ok_json!(result.map_err(error::ErrorUnprocessableEntity)?)
}

Завести статик, импортировать его и передавать в функцию:
static DB: tokio::sync::OnceCell<PgPool> = tokio::sync::OnceCell::const_new();

// в мейне зовём get_or_init

#[get("api/users")]
pub async fn get_user(user_info: Json<UserInfo>) -> ResultJson<User> {
let result = users_service::get_user(user_info.0, &mut acquire_conn!(DB)).await;
ok_json!(result.map_err(error::ErrorUnprocessableEntity)?)
}

Какие могут быть проблемы, есть ли разница в перфе?

actix_web::web::Data - обёртка над Arc<T>, то есть пул это Arc<PgPool>
во втором случае это будет tokio::sync::OnceCell<PgPool>, то есть UnsafeCell + семафор с одним атомиком.

Почему задался этим: надоело каждый раз писать pool: Data<PgPool> и потом дерефить его.

Насколько лучше актиксовский шаред стейт чем собственный с токийскими oncecell'ами?
С учётом того, что токийский OnceCell возвращает Option, я бы вообще использовал unsafe { DB.get_unchecked() } чтобы вырезать ветку паники, учитывая, что до роутов невозможно добраться, минуя инит пула.

5 ответов

24 просмотра

С глобальной переменной ты не сможешь в одном процессе запустить два экземпляра приложения с разными PgPull-ами. Не сможешь в тестах менять значение этого статика на лету. Ну в целом, глобальные переменные - это зло.

В чем проблема передавать коннекшн вместо пулла?

George-C. Автор вопроса
Kirill Kuzminykh
С глобальной переменной ты не сможешь в одном проц...

Хм. Тогда не проще атрибутным макросом прокидывать коннекшен в аргументы функции неявно? Под #[post()] навесить #[with_pool] Или вообще брать коннекшен прямо внутри функции. #[with_connection(var_name="conn")] Хотя это уже макросы ради макросов. Точнее макросы ради "не засорять функцию двумя строчками"

George-C. Автор вопроса

Похожие вопросы

Обсуждают сегодня

Господа, а что сейчас вообще с рынком труда на делфи происходит? Какова ситуация?
Rꙮman Yankꙮvsky
29
А вообще, что может смущать в самой Julia - бы сказал, что нет единого стандартного подхода по многим моментам, поэтому многое выглядит как "хаки" и произвол. Короче говоря, с...
Viktor G.
2
30500 за редактор? )
Владимир
47
а через ESC-код ?
Alexey Kulakov
29
Гайс, вопрос для разносторонее развитых: читаю стрим с юарта, нада выделять с него фреймы с определенной структурой, если ли чо готовое, или долбаться с ринг буффером? нада у...
Vitaly
9
Чёт не понял, я ж правильной функцией воспользовался чтобы вывести отладочную информацию? но что-то она не ловится
notme
18
У меня есть функция где происходит это: write_bit(buffer, 1); write_bit(buffer, 0); write_bit(buffer, 1); write_bit(buffer, 1); write_bit(buffer, 1); w...
~
14
Добрый день! Скажите пожалуйста, а какие программы вы бы рекомендовали написать для того, чтобы научиться управлять памятью? Можно написать динамический массив, можно связный ...
Филипп
7
Недавно Google Project Zero нашёл багу в SQLite с помощью LLM, о чём достаточно было шумно в определённых интернетах, которые сопровождались рассказами, что скоро всех "ибешни...
Alex Sherbakov
5
длина пакета фиксированная, или меняется?
Okhsunrog
7
Карта сайта