Существует ли “встроенный DBMS” для поддержки нескольких приложений писателя (процессы) на тех же файлах дб?

Я должен знать, существует ли какой-либо встроенный DBMS (предпочтительно в Java и не обязательно реляционный), который поддерживает несколько приложений писателя (процессы) на том же наборе файлов дб. BerkeleyDB поддерживает несколько средств чтения, но всего одно устройство записи. Мне нужны несколько устройств записи и несколько средств чтения.

ОБНОВЛЕНИЕ:

Это не несколько проблема соединения. Я подразумеваю, что мне не нужны многочисленные связи к под управлением приложению DBMS (процесс) для записи данных. Мне нужны несколько приложений DBMS (процессы) для фиксации на тех же файлах устройства хранения данных.

HSQLDB, H2, JavaDB (Derby) и MongoDB не поддерживают эту функцию.

Я думаю, что могут быть некоторые ограничения Файловой системы, которые запрещают это. Если так, есть ли Файловая система, которая позволяет нескольким писателям на единственном файле?

Вариант использования: вариант использования является кластеризируемой системой высокой пропускной способности, которая намеревается сохранить ее записи в журнале бизнеса большого объема в устройство хранения данных SAN. Хранение бизнеса входит в систему, отдельные файлы для каждого сервера не соответствуют, потому что запрос и возможности индексации необходимы на целых журналах бизнеса.

Поскольку "SAN обычно является своей собственной сетью устройств хранения, которые обычно не доступны через регулярную сеть стандартными устройствами", я хочу использовать пропускную способность сети SAN для входа, в то время как кластерная пропускная способность LAN привыкла для другого сервера к серверу и клиента к связи сервера.

15
задан Amir Moghimi 18 January 2010 в 09:04
поделиться

9 ответов

Вы в основном не повезете, если вы как-то не измените ваши требования.

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

Итак, игра с точки зрения наличия нескольких процессов записи в тот же файл, заключается в том, как эти процессы координат? Как они гарантируют, что они не идут друг на друга. В, опять же, Unix, есть механизм блокировки на основе ОС, который можно использовать для предотвращения того, что, но обычно большинство систем реализуют центральный сервер и координировать все их запись через эту систему, и затем пишет на диск во время смягчения и Обработка любых конфликтов.

Ваша проблема в две части.

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

Во-вторых, вы предлагаете не только несколько процессов, пишут к тому же объему, но, что объем, который они пишут, передается в SAN. Это другой гаечный ключ.

В отличие от NFS, Sans не поддерживает «файловые системы». Скорее они поддерживают «хранение». В основном блокируйте устройства. Sans, как только вы пройдете кучу тома управления Shenanigans, на самом деле довольно красивые «глупые» с точки зрения ОСС.

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

Проще говоря, Sans - это хранилище уровня блока. Блок, скажем, 4K байты. Это «атомная» единица работы для Сан. Хотите изменить один байт данных? Прочитайте 4K Block из SAN, измените свой байт и напишите 4K Block Back.

Если у вас есть несколько машин, думая, что у них есть «универсальный» доступ к хранилище SAN, и лечит его в качестве файловой системы, у вас есть поврежденная, разрушенная файловая система. Это так просто. Машины будут писать то, что они думают, что блоки должны выглядеть как в то время как другие машины и разбивая его своей локальной версией. Катастрофа. Руины Не счастлив.

Даже получение одной машины, чтобы написать в Сан, в то время как другой читает из него сложно. Это также медленно, так как читатель может внести несколько предположений о содержимом диска, поэтому его необходимо прочитать, и повторно читайте блоки (он не может кэшировать что угодно, например, файловую систему TOC, и т. Д., Как, ну, они » Изменение позади спина из-за активности писателя - Итак, прочитайте его снова ... И снова ...).

Вещи, такие как NFS «решают» эту проблему, потому что вы больше не работаете с необработанным хранением. Скорее вы работаете с фактической файловой системой.

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

Если у вас есть 5 машин потоковых машин, и вы хотите «вся активность с 12:00 до 12:05 вечера», затем сделайте 5 запросов, один на каждый журнальный магазин и консолидируйте результаты. Что касается того, как эффективно запрашивать данные журнала, это проблема индексации, а не непреодолимая в зависимости от того, как вы запросите. Если вы запросите по времени, то создайте файлы по времени (каждую минуту, каждый час, что угодно) и сканируйте их. Если ваша система «прочитана редко», это не имеет большого значения. Если вам нужно более сложную индексацию, то вам нужно будет придумать что-то еще.

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

CouchDB может работать или что-то подобное, из-за его специфического аварийного устойчивого, всегда последовательного формата базы данных. Это DataFile всегда читается экземпляром базы данных. Это может быть вариант для вас.

Но я все равно сделаю несколько запросов и слиться их.

13
ответ дан 1 December 2019 в 01:30
поделиться

Ответ в одну строку:

M = D==repmat(max(D),size(D,1),1)

или более элегантно:

M = bsxfun(@eq, D, max(D))

Обновить:

Согласно комментариям, если вы хотите быть на безопасной стороне и поймать случайные неуникальные максимумы, добавьте следующее утверждение:

M( cumsum(M)>1 ) = false

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

-121--4180439-

Делегат Func в .net 3.5 можно использовать в качестве параметра метода RunTheMethod. Делегат Func позволяет указать метод, который принимает ряд параметров определенного типа и возвращает один аргумент определенного типа. Вот пример, который должен работать:

public class Class1
{
    public int Method1(string input)
    {
        //... do something
        return 0;
    }

    public int Method2(string input)
    {
        //... do something different
        return 1;
    }

    public bool RunTheMethod(Func<string, int> myMethodName)
    {
        //... do stuff
        int i = myMethodName("My String");
        //... do more stuff
        return true;
    }

    public bool Test()
    {
        return RunTheMethod(Method1);
    }
}
-121--1781594-

HSQLDB является полнофункциональной базой данных, которая поддерживает множественные соединения и уровень изоляции транзакций READ _ UNCOMMITTED . Если это вас устраивает, идите на это.

Для получения информации о способах запуска БД см. здесь .

3
ответ дан 1 December 2019 в 01:30
поделиться

Java DB - поддерживаемое солнцем. Распределение открытого источника Apache Derby 100% Java Technology. Он полностью транзакционный, безопасный, простой в использовании, API на основе стандартов - SQL, JDBC и Java EE - но небольшой, только 2,5 МБ.

Java db включен в Java SE JDK, а также база данных разработчиков для сервера Enterprise Sun Glassfish.

Может быть запущен в Client / Server (или даже встроенный сервер) режим, чтобы разрешить несколько подключений.

Обновление: Маленькая ошибка, Java DB не является частью Java SE, как я написал изначально, но о JDK.

Обновление 2: Теперь, когда был разъяснен вопрос, мое понимание заключается в том, что OP на самом деле ищет что-то вроде «общих серверов баз данных хранения данных» (и встраиваемых), и я на самом деле не думаю, что Java DB принадлежит Эта категория. Честно говоря, мне интересно, существует ли это даже. Я знаю, что некоторые растворы кластеризации базы данных используют общий хранилище ( Oracle RAC , DB2), но я не понимаю вопрос о том, что касается кластеризации базы данных. Кроме того, такие решения в моих знаниях не вложены. Но я скорощу это немного больше (и держите близок на этот вопрос).

2
ответ дан 1 December 2019 в 01:30
поделиться
2
ответ дан 1 December 2019 в 01:30
поделиться

Коррекция: MongoDB поддерживает многогранник, как напрямую, так и через монгос.

0
ответ дан 1 December 2019 в 01:30
поделиться
3
ответ дан 1 December 2019 в 01:30
поделиться

У отдельных процессов поток его журналов для отдельных файлов / дБ, чтобы избежать повреждения. Тогда вы можете иметь процесс демона, который асинхронно читает из всех этих файлов / дБ и пишет в единый консолидированный файл / дБ. Когда вы должны индексировать или запросить журналы, сделайте это на консолидированном файле / дБ. Единственным вопросом вот то, что у вас не будет доступ к реальному времени к вашим журналам. Там будет какая-то отставание, пока журналы не будут консолидированы.

Обновленные детали ниже:

  • Процесс - 1 для обработки - N пишет в log-1 для log-n
  • Asyncronify, Process-X читается из log-1 для ввода и консолидации Один журнал Log-X (весь журнал Biz)
  • . Дополнительное Process-X может удалить журнал 1 для входа-n, пока он заполняет log-x, чтобы освободить пробел
  • log Reader использует log-x (весь журнал Biz Несомненно С вопросами и возможностями индексации


    -------------     -------------           -------------  
    |           |     |           |           |           |  
    | Process-1 |     | Process-2 |    ...    | Process-N |  
    |           |     |           |           |           |  
    -------------     -------------           -------------  
          |                 |                       |        
          |                 |                       |        
          V                 V                       V        
      ( log-1 )         ( log-2 )      ...      ( log-N )    
            \                \                    /          
             \                \                  /           
              - - - -  \      |         / - - - -            
                        \     |        /                     
                          \   |     -                        
                            \ |  /                           
                             |||                             
                             VVV                             
                       -------------                         
                       |           |                         
                       | Process-X |                         
                       |           |                         
                       -------------                         
                             |                               
                             V                               
                             V               --------------  
                             V               |            |  
                         ( log-X )  ------>>>| Log Reader |  
                                             |            |  
                                             --------------  

8
ответ дан 1 December 2019 в 01:30
поделиться

Попробуйте FirebirdSQL (ранее Borland Interbase). Имеет режимы «Суперсервер» и «Классический». Первый представляет собой обычный многопоточный сервер базы данных, а второй следует классической модели «один процесс на соединение». Различные процессы координируются в основном через блокировку файлов данных на уровне ОС. Насколько мне известно, на самом деле вы можете встроить классический сервер в свой собственный код. Тогда ваше приложение станет еще одним классическим процессом.

http://www.firebirdfaq.org/faq25/
http://www.firebirdfaq.org/Firebird-Embedded-Linux-HOWTO.html

Обновление: не читал Java-часть. В этом случае вам, вероятно, будет лучше ответить на любой другой вопрос.

Обновление: когда я говорю «блокировка», я не имею в виду блокировку всей базы данных сразу. Даже в классическом режиме это полноценная СУБД. Однако я недостаточно хорошо знаю программное обеспечение, чтобы понять, что на самом деле происходит под капотом.

3
ответ дан 1 December 2019 в 01:30
поделиться

2Gregg - Нет, Berkeley DB - это как раз то, что встроено.
2Амир - Как сказала Аликс Аксель, SQlite стоит попробовать.

Я недавно протестировал несколько из вышеупомянутых движков БД во встраиваемом режиме, превзойдя их всех с помощью Java и SQLite! Это очень быстро на довольно больших объемах данных, вставленных / обновленных в транзакции. Не читай старые вопросы.

Так что, если вам подходят блокировка и параллелизм SQLite, попробуйте один. И ИМХО модель с несколькими журналами / записывающими устройствами с одним асинхронным считывателем / консолидатором - единственное разумное решение.

1
ответ дан 1 December 2019 в 01:30
поделиться
Другие вопросы по тегам:

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