встроенная база данных Java w/способность сохранить как один файл

Если вам нужно что-то лаконичное и относительно безопасное, вы можете просто перенести проверку типов во время компиляции на время выполнения:

static final Map<String, Integer> map = MapUtils.unmodifiableMap(
    String.class, Integer.class,
    "cat",  4,
    "dog",  2,
    "frog", 17
);

Эта реализация должна отлавливать любые ошибки:

import java.util.HashMap;

public abstract class MapUtils
{
    private MapUtils() { }

    public static <K, V> HashMap<K, V> unmodifiableMap(
            Class<? extends K> keyClazz,
            Class<? extends V> valClazz,
            Object...keyValues)
    {
        return Collections.<K, V>unmodifiableMap(makeMap(
            keyClazz,
            valClazz,
            keyValues));
    }

    public static <K, V> HashMap<K, V> makeMap(
            Class<? extends K> keyClazz,
            Class<? extends V> valClazz,
            Object...keyValues)
    {
        if (keyValues.length % 2 != 0)
        {
            throw new IllegalArgumentException(
                    "'keyValues' was formatted incorrectly!  "
                  + "(Expected an even length, but found '" + keyValues.length + "')");
        }

        HashMap<K, V> result = new HashMap<K, V>(keyValues.length / 2);

        for (int i = 0; i < keyValues.length;)
        {
            K key = cast(keyClazz, keyValues[i], i);
            ++i;
            V val = cast(valClazz, keyValues[i], i);
            ++i;
            result.put(key, val);
        }

        return result;
    }

    private static <T> T cast(Class<? extends T> clazz, Object object, int i)
    {
        try
        {
            return clazz.cast(object);
        }
        catch (ClassCastException e)
        {
            String objectName = (i % 2 == 0) ? "Key" : "Value";
            String format = "%s at index %d ('%s') wasn't assignable to type '%s'";
            throw new IllegalArgumentException(String.format(format, objectName, i, object.toString(), clazz.getSimpleName()), e);
        }
    }
}
9
задан Jason S 21 July 2009 в 17:13
поделиться

8 ответов

Я думаю, что сейчас я просто собираюсь продолжать использовать HDF5 для постоянного хранения данных вместе с H2 или какой-либо другой базой данных для индексации в памяти. Я не могу заставить SQLite использовать большие двоичные объекты с драйвером Java, который у меня есть, и я не могу запустить и запустить встроенный Firebird, и я пока не доверяю H2 с PAGE_STORE.

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

Если вам нужен только доступ для чтения, тогда H2 может читать файлы базы данных из zip-файла .

Аналогичным образом, если вам не требуется постоянство, можно иметь версию H2 только в памяти.

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

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

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

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

Однажды я использовал базу данных объектов, которая сохранила свои данные в файл. Он имеет интерфейс Java и .NET. Возможно, вы захотите это проверить. Он называется db4o .

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

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

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

Это не механизм SQL, но если вы используете Prevayler с XStream , вы можете легко создать один XML-файл со всеми вашими данными. . (Превейлер называет это файлом моментального снимка.)

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

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

Вы можете попробовать jdbm - мы используем его в нескольких проектах, и это довольно быстро. Он действительно использует 2 файла (файл базы данных и файл журнала), если вы используете его для приложений типа ACID, но вы можете напрямую перейти к прямому доступу к базе данных (без файла журнала), если вам не нужен твердый ACID.

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

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

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

И H2, и HSQLDB были бы отличным выбором, если бы у вас не было требований к одному файлу.

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

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