Pregunta

Necesito ideas para implementar un mecanismo de base de datos / almacenamiento en memoria (realmente) de alto rendimiento en Java. En el rango de almacenamiento de más de 20,000 objetos java, actualizados cada 5 segundos más o menos.
Algunas opciones a las que estoy abierto:

Combinación JDBC / base de datos pura

JDO

Combinación JPA / ORM / base de datos

Una base de datos de objetos

Otros mecanismos de almacenamiento

¿Cuál es mi mejor opción? ¿Cuáles son tus experiencias?

EDITAR: también necesito poder consultar estos objetos

¿Fue útil?

Solución

Podría intentar algo como Prevayler (básicamente un caché en memoria que maneja la serialización y la copia de seguridad para usted para que los datos persistan y sean transaccionalmente seguros). Hay otros proyectos similares. Lo he usado para un proyecto grande, es seguro y extremadamente rápido.

Si es el mismo conjunto de 20,000 objetos, o al menos no 20,000 objetos nuevos cada 5 segundos pero muchos cambios, es mejor que guarde en caché los cambios y escriba periódicamente los cambios en modo por lotes (las actualizaciones por lotes de jdbc son mucho más rápidas que las actualizaciones de filas individuales). Depende de si necesita que cada escritura esté envuelta transaccionalmente y si necesitará un registro de los registros de cambios o simplemente cambios agregados.

Editar : como otras publicaciones han mencionado Prevayler, pensé en dejar una nota sobre lo que hace: Básicamente, crea un objeto de búsqueda / serializable (generalmente un Mapa de algún tipo) que se envuelve en una instancia de Prevayler, que se serializa en el disco. En lugar de realizar cambios directamente en su mapa, realiza cambios enviando a su instancia de Prevayler un registro serializable de su cambio (solo un objeto que contiene la instrucción de cambio). La versión de Prevayler de una transacción es escribir sus cambios de serialización en el disco para que, en caso de falla, pueda cargar la última copia de seguridad completa y luego reproducir los cambios en contra. Es seguro, aunque debe tener suficiente memoria para cargar todos sus datos, y es una API bastante antigua, por lo que desafortunadamente no hay interfaces genéricas. Pero definitivamente estable y funciona como se anuncia.

Otros consejos

Recomiendo encarecidamente H2 . Este es un tipo de "segunda generación" versión de HSQLDB realizada por uno de los autores originales. H2 nos permite probar nuestra capa DAO sin requerir una base de datos PostgreSQL real, que es increíble .

Hay un grupo de red activo y una lista de correo, y el autor Thomas Mueller responde muy bien a las consultas (ja, pequeño juego de palabras allí).

No sé si es la opción más rápida, pero estoy muy satisfecho con H2 cada vez que lo he usado. Está escrito por la misma persona que originalmente escribió Hypersonic (que más tarde se convirtió en HSQLDB).

Otra opción que supuestamente es muy rápida es Prevayler .

Es una pregunta un poco antigua, pero en estos días hay muchas bases de datos que tienen un nivel de rendimiento de 20,000 / s. La base de datos que elija dependerá de la estructura de datos y del tipo de consultas que desee realizar. También depende del volumen general.

Tuvimos un problema similar con un gran volumen de datos de series de tiempo, aproximadamente 300,000 rec / sy terminamos escribiendo una nueva base de datos NFSdb , con API lo suficientemente simple y un rendimiento decente. Puede hacer alrededor de 2,000,000 de escrituras de objeto / sy lo eliminamos sin ORM. La API de almacenamiento se parece a:

JournalFactory factory = new JournalFactory("/mnt1/data/tick");

MyObject o = new MyObject();
try (JournalWriter<MyObject> writer = factory.writer(MyObject.class)) {

   o.setBlah(...);
   writer.append(o);

   // more appends here
   //
   writer.commit();
}

Pruebe lo siguiente, funciona muy bien con Hibernate y otros marcos ORM

http://hsqldb.org/

Me gustaría probar OrientDB .

Chronicle Map es una base de datos persistente de Java pura incrustable, que proporciona un simple java .util.Map interfaz. Soporta 1 millón consultas / actualizaciones por segundo de un solo hilo , rendimiento de lectura / escritura consistente y escala casi linealmente a la cantidad de núcleos en la máquina.

Aquí hay algunas investigaciones recientes de rendimiento con números reales:

La terracota también podría ser una respuesta para ti. Permite que varias máquinas virtuales compartan objetos para que pueda distribuir la carga, etc. ...

También puede consultar db4o

Si desea almacenar todos sus datos en la memoria, puede consultar Prevayler .

Nunca lo he usado yo mismo, pero parece una solución mucho mejor que usar una base de datos relacional para aquellos casos en los que todos sus datos pueden almacenarse en la memoria.

Berkeley DB para Java es un rápido en memoria base de datos, extremadamente útil para gráficos de objetos simples.

hsqldb es bastante rápido, pero no es seguro para transacciones ACID. La base de datos java más rápida que conozco es db4o: puntos de referencia .

Editar : Tenga en cuenta que Prevayler no es una base de datos, consulte http://www.prevayler.org/wiki.jsp?topic=PrevaylerIsNotADatabase . Si no tienes RAM, no tienes suerte.

H2 es realmente fantástico, de hecho, en memoria, servidor normal y transaccional, lo tienes todo. Sin embargo, no se compara en rendimiento con las bases de datos de objetos, veo Db4o mencionado, de hecho, he tenido un rendimiento mucho mejor con Neodatis, y todo está muy bien configurado en los repositorios de Maven. Aunque no es muy robusto, como un Ferrari, rápido pero no como un camión como Oracle.

Puede probar CSQL (disponible en código abierto y versión empresarial) Proporciona una mejora del rendimiento 30X sobre disco sistemas de bases de datos y proporciona interfaz JDBC. Se puede configurar para funcionar como base de datos de memoria principal independiente o como caché transparente para bases de datos MySQL, Postgres, Oracle.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top