Quick'n'dirty упорство
Мне часто требуется быстрое (с точки зрения кода), легкое (с точки зрения времени выполнения, зависимостей) решение персистентности для простой группы объектов, в основном между перезапусками приложения.
Обычно я прибегаю к некоторому взлому Java-сериализации, но мне интересно, есть ли что-нибудь лучше.
Вы использовали что-то подобное?
Чтобы было понятно, решение на основе JPA не легкое в моей книге, а решение на основе JDBC не быстрое.
Обновление: я предпочитаю рамки без конфигурации по сравнению с теми, которые требуют настройки. Например, решение для сериализации Java требует implements Serializable
и это работает. Решение JPA, с аннотациями или с файлами сопоставления, будет слишком тяжелым.
Обновление 2: Просто чтобы прояснить, я не думаю, что Сериализация это взломать. На самом деле это очень мощный механизм, просто я использую его хакерским способом, делая настойчивость.
9 ответов
Я предпочитаю XStream: нужен только один Jar, быстрый и очень простой в использовании
Попробуйте iBatis. Я недавно использовал его в проекте, где я хотел абстракцию JDBC без ORM/spring/container/etc.
Простота установки, всего пара маленьких баночек, а конфигурация очень гибкая. Это не даст вам гибкость гибернации, уведомление об изменении в моментах, et. и др. но это довольно легкий.
Возможно, db4o подойдет вам. Не позволяйте имени обмануть вас, оно может быть встроено. Согласно его учебнику:
Object yourObject = ...;
String fileName = ...; // where you wish to store the objects
ObjectContainer container = Db4oEmbedded.openFile(Db4oEmbedded.newConfiguration(), fileName);
try {
container.store(yourObject);
} finally {
container.close();
}
Я бы добавил Джексона (JSON) и JAXB (XML); в дополнение к Xstream это уже упоминалось. Джексон хорошо работает только с одним предупреждением: если у вас есть обширное полиморфное хранилище, десериализация может стать сложной. Вот где Xstream работает лучше.
И я согласен с тем, что сериализация Java не хороша для персистентности - она хороша для переноса сериализованных объектов, но персистентность имеет временное измерение, и классы меняются со временем; и именно здесь начинаются проблемы (я уверен, что вы это знаете, но, поскольку другие, кажется, не понимают, почему peristing-using-serialization плоха, подумал, что я упомяну это). Кроме того, гораздо проще наблюдать за сериализацией с использованием текстовых форматов (json, xml), чем двоичных. И, наконец, если вам нужна экономия пространства, сжатие (например, gzip) творит чудеса, размер данных после сжатия имеет тенденцию быть одинаковым, независимо от формата (при условии, что объем информации одинаковый)
Для коллекций объектов попробуйте JDBM (одна банка). Дает вам карту, которая хранится на диске.
DB db = new DBMaker(fileName).build();
Map<String,MyObject> map = db.createTreeMap("mapName")
map.put("obj1", myObject1);
Для конфигурации JAXB действительно прост и не имеет зависимостей. Магазины в XML.
JAXB.marshall(myObject, new File("config.xml") ); // saved. that's it
Вы должны посмотреть на JAXB. Он является частью Java начиная с JRE 6. Он довольно прост в использовании и позволяет вам управлять XML-схемой из вашей объектной модели Java. Самое приятное, что вам не нужны никакие дополнительные jar-файлы или библиотеки, так как это часть Java. Проверьте пакет javax.xml.bin.
Информация о самом проекте JAXB: https://jaxb.dev.java.net/
Ссылка на JavaDocs в JRE: http://java.sun.com/javase/6/docs/api/javax/xml/bind/package-frame.html
Prevayler звучит как хороший вариант для вас.
Он основан на сериализации Java и чертовски быстр.
Больше информации на:
- http://www.prevayler.org/
- http://www.prevayler.org/wiki/
Проверьте BeanKeeper - это самая быстрая, самая грязная и простая ORM/ постоянство, которое я когда-либо видел. Конечно, это лучше, чем iBatis.
Store myStore = new Store((DataSource) ctx.lookup("jdbc/myds"));
package com.acme.bookstore;
public class Book
{
private String title;
private Author author;
...setters, getters...
}
package com.acme.bookstore;
public class Author
{
private String firstName;
private String lastName;
private Date birthDate;
...setters, getters...
}
store.save(book);
Ты ищешь
Устойчивое решение для просто множества объектов
Так почему встроенная Java-сериализация - это взлом?
Если вы ленивы, возможно, вам поможет сериализация с JSON.