java database performance embedded-database

java db



La base de datos de mayor rendimiento en Java (14)

Necesito ideas para implementar un Mecanismo de almacenamiento / base de datos (realmente) de alto rendimiento en memoria en Java. En el rango de almacenamiento de más de 20,000 objetos de Java, se actualiza cada 5 segundos aproximadamente.
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


Podría intentar algo como Prevayler (básicamente un caché en memoria que maneja la serialización y la copia de seguridad para que los datos persistan y sea transaccionalmente seguro). 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 hay muchos cambios, es mejor que guarde en caché los cambios y escriba periódicamente los cambios en modo batch (las actualizaciones por lotes de jdbc son mucho más rápidas que las filas individuales actualizaciones). Depende de si necesita que cada escritura se ajuste transaccionalmente, y si necesita un registro de los registros de cambios o simplemente agrega cambios.

Editar : como otras publicaciones han mencionado Prevayler, pensé en dejar una nota sobre lo que hace: básicamente creas un objeto buscable / serializable (típicamente un Mapa de algún tipo) que está envuelto en una instancia de Prevayler, que se serializa en el disco. . En lugar de realizar cambios directamente en el 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 de eso. Es seguro, aunque tienes que tener suficiente memoria para cargar todos tus datos, y es una API bastante antigua, por lo que desafortunadamente no hay interfaces genéricas. Pero definitivamente estable y funciona como se anuncia.


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

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


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

http://hsqldb.org/


Si desea almacenar todos sus datos en la memoria, es posible que desee ver Prevayler .

Nunca lo he usado, 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 for Java es una base de datos rápida en memoria, extremadamente útil para gráficos de objetos simples.


Recomiendo H2 . Este es un tipo de versión de "segunda generación" de HSQLDB realizada por uno de los autores originales. H2 nos permite probar nuestra capa DAO sin necesidad de una base de datos real de PostgreSQL, lo cual es asombroso .

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


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.


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


También puedes echar un vistazo a db4o


H2 es realmente fantástico, de hecho, en la memoria, servidor normal y transaccional, lo tienes todo. Sin embargo, no se compara el rendimiento con las bases de datos de objetos. Veo a 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.



Es una pregunta un poco vieja, pero en estos días hay una gran cantidad de bases de datos que tienen un nivel de rendimiento de 20,000 / s. La base de datos que elija depende de la estructura de datos y el tipo de consultas que le gustaría realizar. También depende del volumen general.

Tuvimos un problema similar con un gran volumen de datos de series de tiempo, alrededor de 300,000 rec / sy terminamos escribiendo una nueva base de datos NFSdb , con suficiente API y un rendimiento decente. Puede hacer aproximadamente 2,000,000 escrituras de objeto y nosotros lo eliminamos sin ORM. La API de almacenamiento tiene un aspecto similar 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(); }


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

Aquí hay algunos estudios de rendimiento recientes con números reales: