Существует ли легкая встраиваемая база данных ключ / значение? (что-то вроде диеты couchdb) [закрыто]

Что вызывает ArrayIndexOutOfBoundsException?

Если вы думаете о переменной как о «поле», где вы можете поместить значение, то массив представляет собой ряд ящиков, расположенных рядом с eachother, где число Ячейки представляют собой конечное и явное целое число.

Создание такого массива:

final int[] myArray = new int[5]

создает строку из 5 полей, каждая из которых имеет int. Каждый из ящиков имеет индекс, позицию в ряду ящиков. Этот индекс начинается с 0 и заканчивается на N-1, где N - размер массива (количество ящиков).

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

myArray[3]

Который даст вам значение 4-го ящика в серии (так как в первом поле есть индекс 0).

ArrayIndexOutOfBoundsException вызвано попыткой извлечь «ящик», который не существует, передав индекс, который выше индекса последнего «поля» или отрицательный.

В моем примере работы эти фрагменты кода приведут к такому исключению:

myArray[5] //tries to retrieve the 6th "box" when there is only 5
myArray[-1] //just makes no sense
myArray[1337] //waay to high

Как избежать ArrayIndexOutOfBoundsException

Чтобы предотвратить ArrayIndexOutOfBoundsException, необходимо рассмотреть некоторые ключевые моменты:

Looping

При переходе по массиву всегда убедитесь, что индекс, который вы извлекаете, строго меньше длины массива (количество ящиков). Например:

for (int i = 0; i < myArray.length; i++) {

Обратите внимание на <, никогда не смешивайте там =.

Возможно, вам захочется сделать что-то вроде этого:

for (int i = 1; i <= myArray.length; i++) {
    final int someint = myArray[i - 1]

Просто нет. Придерживайтесь одного выше (если вам нужно использовать индекс), и это сэкономит вам много боли.

По возможности используйте foreach:

for (int value : myArray) {

Таким образом, вы вообще не придется вообще обдумывать индексы.

Когда вы выполняете цикл, что бы вы ни делали, НИКОГДА не изменяйте значение итератора цикла (здесь: i). Единственное место, которое должно изменить значение, это сохранить цикл. Изменение в противном случае просто рискует исключением и в большинстве случаев не является обязательным.

Retrieval / update

При извлечении произвольного элемента массива всегда проверяйте его действительность индекс по длине массива:

public Integer getArrayElement(final int index) {
    if (index < 0 || index >= myArray.length) {
        return null; //although I would much prefer an actual exception being thrown when this happens.
    }
    return myArray[index];
}
14
задан starblue 24 July 2009 в 20:07
поделиться

6 ответов

На странице Связанные проекты вики CouchDB в разделе «Альтернативы» упоминаются некоторые похожие проекты:

  • Feather DB * клон CouchDB в java.
  • StrokeDB * База данных, подобная CouchDB, написанная на Ruby для упрощения встраивания в приложения Ruby.
  • mongoDB Высокопроизводительный документ с открытым исходным кодом и без схем. ориентированная база данных.

И, конечно же, Tokyo Cabinet , о котором уже упоминалось.

Также есть neo4j , который является «графической базой данных» для java.

Конечно, , часть возможностей CouchDB и некоторых других заключается не только в возможности хранить пары ключ / значение, но и в высокой емкости, репликации и, в частности, представлениях, которые в основном являются способом выполнения запросов к вашим документам.

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

A немного сложно ответить, не зная больше о ваших потребностях (язык программирования, требования параллелизма, объемы данных и т. д.).

* Веб-сайт, похоже, не работает на момент написания этой статьи.

7
ответ дан 1 December 2019 в 12:53
поделиться

Файловая система ОС - это облегченная база данных ключ / значение. Ключи - это имена файлов, а значения - это данные в файлах.

Слово «встраиваемый» имеет странное значение, если оно должно быть RESTful, поэтому я действительно не понимаю ваших требований; но если все, что вам нужно, это хранение и извлечение, почему бы не использовать FS?

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

Для какой платформы? Tokyo Cabinet - это легкий, встраиваемый, ассоциативный механизм базы данных для различных сред сценариев (Java, Ruby, Perl, Lua и др.)

1
ответ дан 1 December 2019 в 12:53
поделиться

Подойдет ли TinyCDB?

http://www.corpit.ru/mjt/tinycdb.html

Введение

TinyCDB - очень быстрый и простой пакет для создания и чтения постоянных баз данных, структуры данных, представленной Дэном Дж. Бернстайном в его cdb пакет. Его можно использовать для ускорения поиска в последовательности пар (ключ, значение) с очень большим количеством записей. Пример использования - индексация большого списка пользователей - где для поиска потребуется линейное чтение большого файла / etc / passwd и для многих других задач. Это' Использование / API похоже на те, которые можно найти в BerkeleyDB, gdbm и традиционных библиотеках dbm / ndbm * nix, и в значительной степени совместим с пакетом cdb-0.75 Дэна Бернштейна.

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

и запрос занимает очень мало времени.

и запрос занимает очень мало времени.

5
ответ дан 1 December 2019 в 12:53
поделиться

Простая встраиваемая база данных "ключ-значение"? Это почти что BDB

4
ответ дан 1 December 2019 в 12:53
поделиться

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

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

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