LINUX.ORG.RU

[sqlite, C] Ожидание разблокирования базы данных


0

1

Вот такой вопрос: как наиболее правильно сделать, чтобы CGI, обращающийся к БД, которую уже открыл кто-то другой, ожидал, пока база не будет разблокирована?

Сейчас делаю так:

try_exec:
	rc = sqlite3_exec(db, q_str, callback, NULL, &zErrMsg);
	if(rc){
		if((rc == SQLITE_BUSY || rc == SQLITE_LOCKED) && Ntry < Ntry_max){ // база заблокирована другим вызовом
			Ntry++;
			DBG("ooops, DB is busy, try number %d", Ntry);
			usleep(50); // ждем .05с
			goto try_exec; // пробуем снова
		}
		fprintf(stderr, "SQL error: %s, %d\n", zErrMsg, rc);
		die(SQL_ERR);
	}

Но пока к базе обращаются одновременно 2-3 клиента, все ОК, если же клиентов будет очень много, такой способ может привести к длительному ожиданию (смотря какое ограничение на Ntry_max поставить), в конце которого все равно к базе данных CGI не сможет обратиться.

☆☆☆☆☆
Ответ на: комментарий от Eddy_Em

И как же прикажете паузы делать?

Никак. Если у тебя появился цикл с паузами, то ты где-то делаешь что-то не так.

Reset ★★★★★
()
Ответ на: комментарий от Reset

Как - никак? Не обращаться же непрерывно к БД - повиснет же все нафиг...

Запускать отдельного демона, который будет (например, через очередь сообщений) получать команды от CGI, обрабатывать их и посылать сигналы готовности по завершении операции - муторно как-то...

Eddy_Em ☆☆☆☆☆
() автор топика
Ответ на: комментарий от Eddy_Em

Запускать отдельного демона, который будет (например, через очередь сообщений) получать команды от CGI, обрабатывать их и посылать сигналы готовности по завершении операции - муторно как-то...

Зато правильно.

Reset ★★★★★
()
Ответ на: комментарий от Reset

Может и правильно, но эдак моя простенькая библиотечка раздуется до похабных размеров...

Eddy_Em ☆☆☆☆☆
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.