Есть ли локальные БД, поддерживающие многопоточность? - PullRequest
2 голосов
/ 31 марта 2009

я пробовал sqlite, используя многопоточность, только один поток может обновлять БД одновременно. Мне нужно многопоточное обновление базы данных одновременно. Есть ли какая-нибудь БД, способная выполнить эту работу?

ps: я использую delphi6.


Я обнаружил, что sqlite может поддерживать многопоточность,

Но в моем тесте asgsqlite, когда одна нить вставляется, другие не вставляются.

Я все еще на тестировании.

Ответы [ 8 ]

8 голосов
/ 31 марта 2009

SQLite можно использовать в многопоточных средах.

Проверить эту ссылку .

4 голосов
/ 31 марта 2009

Firebird можно использовать во встроенной версии, но также нет проблем с локальной установкой стандартной (серверной) установки. Очень маленький, простой в развертывании, одновременный доступ. Хорошо работает с Delphi, вы должны рассмотреть это как вариант.

См. Также вопрос StackOverflow «Какую встроенную базу данных использовать в приложении Delphi?»

2 голосов
/ 02 апреля 2009

Sqlite блокирует всю базу данных при обновлении (если это не изменилось с момента моего последнего использования). Второй поток не может обновлять базу данных одновременно (даже используя совершенно отдельные таблицы). Однако есть параметр тайм-аута, который указывает второму потоку повторить попытку в течение x миллисекунд, прежде чем произойдет сбой. Я думаю, что ASqlite отображает этот параметр в компоненте базы данных (мне кажется, я действительно написал этот фрагмент кода, все 3 строки, но это было пару лет назад).

Если для тайм-аута задано значение больше 0, это позволит нескольким потокам обновить базу данных. Однако это может повлиять на производительность.

1 голос
/ 31 марта 2009

DBISAM от ElevateSoft прекрасно работает в многопоточном режиме и имеет автоматическое именование сессий, чтобы упростить эту задачу. Обязательно ознакомьтесь со страницей справки о том, как сделать все это безопасным и сделать работу.

1 голос
/ 31 марта 2009

Зачем вам нужно несколько потоков, чтобы обновить его одновременно? Я уверен, что sqlite обеспечит правильное выполнение обновлений, даже если это означает, что один поток ожидает завершения другого; это прозрачно для приложения.

Действительно, одновременное обновление нескольких потоков, по всей вероятности, не повлияет на производительность. Иными словами, может показаться, что несколько потоков обновлялись одновременно, но на самом деле результатом будет то, что обновления будут выполняться медленнее, чем если бы они не выполнялись (из-за того, что им нужно удерживать много блокировок страниц и т. Д., Чтобы избежать проблем) .

1 голос
/ 31 марта 2009

SQL Server 2008 Express поддерживает параллелизм, а также большинство других функций SQL Server. И это бесплатно.

1 голос
/ 31 марта 2009

, начиная с версии 3.3.1, требования потоков SQLite были сильно смягчены . в большинстве случаев это означает, что просто работает . если вам действительно нужно больше параллелизма, лучше использовать сервер БД.

0 голосов
/ 31 марта 2009

На самом деле я сейчас занимаюсь тестированием производительности с помощью многопоточного Java-процесса на Sybase ASE. Процесс анализирует файл размером 1 ГБ и вставляет в таблицу.

Сначала я боялся, потому что многие старшие программисты предупреждали меня о «блокировке таблиц» и о том, как опасно делать параллельный доступ к БД. Но я пошел дальше и сделал тестирование (потому что я хотел выяснить для себя).

Я создал и сравнил однопоточный процесс с процессом, использующим 4 потока. Я получил только 20% сокращение общего времени выполнения. Я повторил процесс, используя разные числа потоков и размеры пакетных вставок. Максимум, который я мог сжать, составлял 20%.

Мы скоро перейдем на Oracle, поэтому я поделюсь с вами тем, как Oracle обрабатывает параллельные вставки, когда это происходит.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...