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 ответов

23 просмотра

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

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

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

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

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

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

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

а через ESC-код ?
Alexey Kulakov
29
30500 за редактор? )
Владимир
47
Чёт не понял, я ж правильной функцией воспользовался чтобы вывести отладочную информацию? но что-то она не ловится
notme
18
У меня есть функция где происходит это: write_bit(buffer, 1); write_bit(buffer, 0); write_bit(buffer, 1); write_bit(buffer, 1); write_bit(buffer, 1); w...
~
13
Недавно Google Project Zero нашёл багу в SQLite с помощью LLM, о чём достаточно было шумно в определённых интернетах, которые сопровождались рассказами, что скоро всех "ибешни...
Alex Sherbakov
5
в JclConsole объявлено так: function CtrlHandler(CtrlType: DWORD): BOOL; stdcall; - где ваше объявление с stdcall? у вас на картинке нет stdcall
Karagy
8
Как передать управляющий символ в открытую через CreateProcess консоль? Собсна, есть процедура: procedure TRedirectThread.WriteData(Data: OEMString); var Written: Cardinal;...
Serjone
6
Ребят в СИ можно реализовать ООП?
Николай
33
Вот еще странный косяк, подскажите как бороться. Я git clone сделал себе всего embassy и примеры там запускаю. Всё хорошо. Но вот решил в cargo.toml зависимости не как в приме...
Lukutin R2AJP
2
program test; {$mode delphi} procedure proc(v: int32); overload; begin end; procedure proc(v: int64); overload; begin end; var x: uint64; begin proc(x); end. Уж не знаю...
notme
6
Карта сайта