Два приложения, использующие одну и ту же базу данных Firebird - PullRequest
0 голосов
/ 16 октября 2018

В моей компании мы находимся под сильным обслуживанием программного обеспечения, мы переписываем некоторые старые приложения.Теперь, по какой-то причине, которая не имеет отношения (частично из-за этого обслуживания), нам нужны два разных приложения для использования одной и той же базы данных Firebird:

одно будет писать, другое будет читать.

Оба приложения будут на одном компьютере (сервере), если это уместно

Возможно ли это?Я знаю, что это плохая архитектура, но мы меняем ее, и на какое-то время я остро нуждаюсь в этой функциональности.Теперь у меня все получилось, но есть некоторые проблемы с записью в базу данных (дублированные записи)

Обновление 1.

Спасибо всем за ваши ответы.Теперь, после некоторых испытаний, я пришел к выводу, что это вовсе не вопрос двух приложений.Приложение для записи работало всю ночь (приложение для чтения отключено), и все еще есть несколько дублированных записей: database_error

Теперь, в предыдущей версии программы (и в предыдущей версии)к базе данных), проблема не существовала.Я сам обновил базу данных, добавив индекс в столбец DateTime:

CREATE DESC INDEX IndexName ON TableName(DateTimeColumnName)

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

1 Ответ

0 голосов
/ 17 октября 2018

Предполагая, что вы используете сервер Firebird (а не Firebird Embedded 1 ), проблем с базой данных в нескольких приложениях не возникает.Однако ваша база данных должна быть правильно спроектирована, а ваши приложения должны правильно управлять своими транзакциями и т. Д.

Использование одной базы данных для нескольких приложений само по себе неплохая архитектура 2 , ноВы должны сознательно спроектировать свою базу данных и приложения для этого совместного использования.

Ваше замечание о том, что "существуют некоторые проблемы с записью в базу данных (дублированные записи)" , звучит так же, как и дизайнбаза данных (например, ограничения) и / или то, как ваши приложения используют базу данных (например, уровень изоляции транзакции, метод генерации идентификаторов и т. д.), является недостаточным.

Например, если ваше приложение генерирует идентификаторы, используя что-то вроде select max(id) + 1 from sometable, то это определенно неправильный путь (это даже неправильно для доступа из одного приложения, если это приложение может генерировать записи одновременно).Вы должны использовать последовательности (и предпочтительно триггеры) для генерации идентификаторов.


  1. Если вы используете Firebird Embedded, то, будет ли это работать, зависит от версии и конфигурации ОС и Firebird.В старых версиях Firebird Embedded для Windows требуется эксклюзивный доступ к файлу базы данных.
  2. В качестве контрпримера для микросервисов обычно считается плохим выбором архитектуры для разделения одной базы данных с несколькими службами, поскольку этоуменьшить гибкость из-за повышенной взаимозависимости.
...