Беркли DB (Java Edition) не является постоянным между запусками приложения - PullRequest
1 голос
/ 19 марта 2012

Я использую базу данных Berkeley для хранения информации для созданного веб-сканера.Однако никакая информация из моей базы данных не сохраняется между сеансами!

Когда я запускаю приложение, count () для каждой БД возвращает 0. В конце сеанса, перед выходом, я печатаю count () длякаждая БД, и она изменилась соответствующим образом, однако она «сбрасывается», когда я снова запускаю программу ... почему это происходит?

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

Ответы [ 4 ]

2 голосов
/ 18 мая 2015

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

DatabaseConfig databaseConfig = new DatabaseConfig();
databaseConfig.setTransactional(true);
1 голос
/ 28 апреля 2016

Я работаю над Berkeley DB последние две недели. Меня также смутил тот же вопрос, и я закончил с этим: если вы закроете среду и базу данных до того, как ваше приложение прекратит работу, данные будут сохранены в файл, который вы указываете его местоположение при открытии базы данных. Закрытие может быть достигнуто после успешного завершения программы. Однако, если происходит сбой или происходит сбой программы, и приложение не может быть завершено в нормальных условиях, я не смог найти, где запустить операцию закрытия.

1 голос
/ 25 июля 2013

Возможно, это могло бы помочь:

EnvironmentConfig environmentConfig = new EnvironmentConfig();
environmentConfig.setAllowCreate(true);
File file = new File("<Path_to_Database>");
Environment environment = new Environment(file, environmentConfig);

DatabaseConfig databaseConfig = new DatabaseConfig();
databaseConfig.setAllowCreate(true);
databaseConfig.setDeferredWrite(true);

Database testDatabase = environment.openDatabase(null, "testDB", databaseConfig);

DatabaseEntry keyEntry = new DatabaseEntry();
DatabaseEntry valueEntry = new DatabaseEntry();
DatabaseEntry fetchedEntry = new DatabaseEntry();

IntegerBinding.intToEntry(1, keyEntry);
StringBinding.stringToEntry("Kwakkel", valueEntry);

testDatabase.put(null, keyEntry, valueEntry);


testDatabase.get(null, keyEntry, fetchedEntry, null);
String fetched = StringBinding.entryToString(fetchedEntry);

System.out.println("Fetched value: " + fetched);

testDatabase.sync();
testDatabase.close();

Я думаю, вы должны установить для 'DeferredWrite' значение 'true'.Затем вы можете использовать 'sync ()' в вашей базе данных, и данные сохранятся.Запустите его, а затем удалите строку с помощью команды «put (...)».Должно еще работать.Ну, по крайней мере, у меня это сработало ...:)

С уважением

Александр Шелл

0 голосов
/ 20 марта 2012

Ответом было использование транзакций и вызов транзакции.commit () после выставления запросов.До сих пор не уверен, как сохранить его с отключенными транзакциями.

...