Comparación de bases de datos integradas de Java [cerrado]

99

Tengo la intención de desarrollar una pequeña aplicación (Java) para administrar mis finanzas. Creo que necesito usar una base de datos incorporada, pero no tengo experiencia en este tema. Traté de ver algunos de los productos disponibles , pero no puedo decidir cuál sería más adecuado para mí. H2 , HSQLDB , Derby y Berkeley DB parecen ser buenos candidatos, pero todavía no veo cómo se comparan entre sí. Agradezco su ayuda comparándolos y ayudándome a decidir cuál usar.

Tengo la intención de usar Hibernate para mi aplicación (a menos que recomiende usar la API proporcionada por DBMS), pero también quiero tener la capacidad de editar la base de datos fácilmente usando una herramienta de navegación SQL (modificando el esquema y cambiando los datos).

Gracias.

Hosam Aly
fuente
Sin saber lo que está tratando de hacer, no es posible responder a esta pregunta. Sugiero actualizar la pregunta con información sobre el tamaño de su proyecto, cuántas tablas cree que tendrá, cuántos registros, etc.
Programador fuera de la ley
3
posible duplicado de bases de datos Java integradas
Hosam Aly
5
Es molesto que los nazis cierren tan buenas preguntas. Claro, algunas preguntas vagas no son adecuadas, pero esta ciertamente lo es. Donde "Adecuado" significa útil para la comunidad, en lugar de algunas definiciones legalistas.
Tuntable

Respuestas:

60

Ya sea

  • HSQLDB : utilizado por OpenOffice, probado y estable. Es fácil de usar. Si desea editar sus datos de base de datos, puede abrir el archivo y editar las declaraciones de inserción.

o

  • H2 : se dice que es más rápido (por el desarrollador, que también diseñó originalmente hsqldb)

El que uses depende de ti, dependiendo de cuánto rendimiento y cuánta estabilidad necesites.

El desarrollador de H2 ha realizado una buena evaluación de rendimiento:
http://www.h2database.com/html/performance.html

Sven Lilienthal
fuente
35

Utilizo Apache Derby para casi todas mis necesidades de bases de datos integradas. También puede usar Java DB de Sun que se basa en Derby, pero la última versión de Derby es mucho más nueva. Admite muchas opciones que admiten bases de datos nativas comerciales, pero es mucho más pequeño y más fácil de integrar. He tenido algunas tablas de bases de datos con más de un millón de registros sin problemas.

Solía ​​usar HSQLDB e Hypersonic hace unos 3 años. Tiene algunos problemas importantes de rendimiento en ese momento y me cambié a Derby debido a esos problemas. Derby ha sido sólido incluso cuando estaba en incubadora en Apache.

Chris Dail
fuente
Derby sería genial si no fuera por el hecho de que hay tantos errores y la última actualización fue hace varios años.
Hooli
2
@Hooli No puedo dar fe de los errores, pero "... la última actualización fue hace varios años" es incorrecta. En relación con el momento en que publicó su comentario ( agosto de 2016 ): hubo un lanzamiento menos de un año antes ( octubre de 2015 ), un lanzamiento dos meses después ( octubre de 2016 ) y un lanzamiento poco más de un año después ( octubre de 2017 - Último ).
Slaw
Actualizar este comentario en caso de que alguien más se encuentre con este tema en una búsqueda. El lanzamiento más reciente de Derby fue en marzo de 2019. Aquí está la información de su sitio: db.apache.org/derby
JavaJd
@Chris Dail ¿Usó derby para millones de registros como base de datos normal o en memoria o para almacenamiento en caché?
Shreyans jain
30

Necesitaba usar la base de datos integrada de Java en uno de mis proyectos e investigué mucho para comprender los pros y los contras de cada base de datos. Escribí un blog que enumeraba los pros y los contras de las bases de datos Java integradas populares (H2, HSQLDB, Derby, ObjectDB, Neo4j, OrientDB), puedes echarle un vistazo. Elegí H2 porque pensé que se adaptaba mejor a mis necesidades. Enlace para el blog: http://sayrohan.blogspot.in/2012/12/choosing-light-weight-java-database.html ¡ Espero que te ayude!

Rohan Karwa
fuente
14

HSQLDB es un buen candidato (el hecho de que se use en OpenOffice puede convencer a algunos de ustedes), pero para una aplicación personal tan pequeña, ¿por qué no usar una base de datos de objetos (en lugar de una base de datos relacional clásica)?

Solía DB4O en uno de mis proyectos, y estoy muy satisfecho con ella. Al estar orientado a objetos, no necesita toda la capa Hibernate y puede insertar / actualizar / eliminar / consultar objetos directamente. Además, no necesita preocuparse por el esquema, ¡trabaja directamente con los objetos y DB4O hace el resto!

Estoy de acuerdo en que puede llevar algún tiempo acostumbrarse a este nuevo tipo de base de datos, ¡pero consulte el tutorial de DB40 para ver qué tan fácil es trabajar con la base de datos!

EDITAR: Como se dijo en los comentarios, DB4O maneja automáticamente las versiones más nuevas de las clases. Además, una herramienta para navegar y actualizar la base de datos fuera de la aplicación está disponible aquí: http://code.google.com/p/db4o-om/

Wookai
fuente
2
Gracias. DB4O se ve bien para un proyecto tan pequeño, pero creo que la capacidad de explorar y editar datos fuera de la aplicación es muy importante. ¿También sería fácil manejar versiones más nuevas de clases? (por ejemplo, campos agregados / eliminados)
Hosam Aly
Como dije en mi edición, existe una herramienta para navegar y editar la base de datos fuera de la aplicación. Y como dijo Fabian, las versiones más recientes de las clases se manejan automáticamente.
Wookai
Gracias por la actualización. Tener una herramienta de navegación fue muy importante para mí, así que muchas gracias.
Hosam Aly
12

Java DB (distribución de Apache Derby de Sun) ahora se incluye en JDK 6.

Quería hacer algo como Jason Cohen y he estado pensando que esta parece la forma más fácil de estar en la distribución JDK (que la semana pasada ahora es un requisito para mi aplicación). O tal vez soy un vago de esa manera.

Stu Thompson
fuente
¡Probablemente tengas razón! Tenemos el requisito de ejecutar también Java 1.5, por lo que esta no es una opción para nosotros.
Jason Cohen
... Quise decir que tenías razón en que era la forma más fácil, no en ser vago. :-P
Jason Cohen
Java DB se envía solo con las implementaciones Sun / Oracle del JDK. No es una parte estándar de Java.
Basil Bourque
7

Usamos HSQLDB en producción como una opción "sin configuración" para nuestra aplicación. Permite que las personas prueben sin la molestia de configurar una base de datos real.

Sin embargo, no lo admitimos para un uso normal. Las razones son varias:

  1. Se ralentiza proporcionalmente al tamaño de los datos.
  2. Difícil de acceder fuera de nuestra aplicación (por ejemplo, para informes personalizados).
  3. Las transacciones / sincronización de disco son difíciles de realizar correctamente, por lo que es fácil perder datos.

Para al menos (2) y (3), hay formas de evitarlo, pero es difícil; es mucho más fácil, por ejemplo, instalar MySQL.

Jason Cohen
fuente
7

neo4j es:

un motor de persistencia Java integrado, basado en disco y totalmente transaccional que almacena datos estructurados en gráficos en lugar de tablas

Todavía no he tenido la oportunidad de probarlo, pero parece muy prometedor. Tenga en cuenta que esta no es una base de datos SQL, su gráfico de objetos se conserva para usted, por lo que puede que no sea apropiado para su aplicación existente.

devstopfix
fuente
5

La mayoría de las cosas ya se han dicho, pero puedo agregar que he usado HSQL, Derby y Berkely DB en algunos de mis proyectos favoritos y todos funcionaron bien. Entonces no creo que realmente importe mucho para ser honesto. Una cosa que vale la pena mencionar es que HSQL se guarda a sí mismo como un archivo de texto con declaraciones SQL, lo cual es bastante bueno. Hace que sea realmente fácil para cuando está desarrollando realizar pruebas y configurar datos rápidamente. También puede realizar ediciones rápidas si es necesario. Supongo que podría transferir fácilmente todo eso a cualquier base de datos si alguna vez necesita cambiar también :)

willcodejavaforfood
fuente
5

HSQLDB puede causar problemas para aplicaciones grandes, no es tan estable.

Lo mejor que he escuchado (aunque no una experiencia de primera mano) es berkleyDB. Pero a menos que lo abra, le costará un brazo y una pierna usarlo debido a la licencia ... vea esto http://www.oracle.com/technology/software/products/berkeley-db/htdocs/licensing.html para detalles.

PD. berkleyDB no es una base de datos relacional en caso de que no lo supiera.

Chii
fuente
¡Oh, no sabía que Berkeley no era una base de datos relacional! ¡Muchas gracias!
Hosam Aly
no significa que no sea bueno. pero sospecho que probablemente sea demasiado bueno para su uso, considerando que es algo personal. también, eche un vistazo a sqlite. Creo que tiene enlaces de Java, pero no puedo encontrarlo en el cajero automático.
Chii
4

Soy un gran fan de DB4O tanto para .Net como para Java .

El rendimiento ha mejorado mucho desde los primeros lanzamientos. El modelo de licencia tampoco es tan malo. Particularmente me gustan las opciones disponibles para consultar sus objetos. La consulta por ejemplo es muy poderosa y fácil de acostumbrar.

Kilhoffer
fuente
4

¿Qué criterios utilizará para evaluarlos? Si aún no lo sabe, no es necesario que lo decida ahora. Intente hacer que su aplicación sea lo más independiente posible de la implementación de la base de datos, proporcionando los contenedores adecuados, los objetos de acceso a los datos, etc., y tome esta decisión cuando tenga todos los hechos a mano y tenga que decidir.

Si está utilizando bases de datos relacionales y SQL, lo anterior no debería ser demasiado difícil (utilizando JDBC, etc.). Asegúrese de tener muchas pruebas circundantes para que cuando desee cambiar entre bases de datos, pueda determinar que la funcionalidad de su aplicación sigue siendo la misma.

Me encontré con el mismo problema hace algún tiempo. No sabía qué base de datos buscar, por lo que mi primera solución usó Derby (¿o HSQLDB?), Y luego pude cambiar a HSQLDB (o Derby? No recuerdo qué solución funcionó) una vez que determiné dónde Tenía problemas (relacionados con el rendimiento) y qué solución realmente funcionaría para mí.

Brian Agnew
fuente
3

He usado Derby y realmente odio sus funciones de conversión de tipo de datos, especialmente las funciones de fecha / hora. (Tipo de número) <--> La conversión a varchar es una molestia.

Entonces, si planea usar conversiones de tipos de datos en sus declaraciones de base de datos, considere el uso de otra base de datos integrada, lo aprendí demasiado tarde.

Conversiones de tipo de datos de la última versión de Derby

Telcontar
fuente
3

Personalmente estoy a favor de HSQLDB, pero sobre todo porque fue el primero que probé.

Se dice que H2 es más rápido y proporciona una interfaz GUI más agradable (que es genérica y funciona con cualquier controlador JDBC, por cierto).

Al menos HSQLDB, H2 y Derby proporcionan modos de servidor que son excelentes para el desarrollo, porque puede acceder a la base de datos con su aplicación y alguna herramienta al mismo tiempo (que el modo integrado generalmente no permite).

Joachim Sauer
fuente
3

Supongo que llego un poco tarde (mucho tarde ;-)) a esta publicación, pero me gustaría agregar Prest, una base de datos incrustada orientada a objetos de código abierto para Java y .NET. por tu consideración. Prest es una base de datos integrada de código abierto / licencia dual para Java. La distribución es compatible con la plataforma Android de Google y también incluye Perst Lite para Java ME. Incluso hemos creado un punto de referencia de Android y hemos elaborado un documento técnico sobre el tema ... puedes echar un vistazo aquí: http://www.mcobject.com/index.cfm?fuseaction=download&pageid=581§ionid=133

Todo lo mejor, Chris


fuente
3

Si estoy en lo cierto, H2 es de los mismos chicos que escribieron HSQLDB. Es mucho mejor si confía en los puntos de referencia de su sitio. Además, existe la idea de que la comunidad del sol saltó demasiado rápido al Derby.

smartnut007
fuente
2
¿De qué se preocupan las nociones de derby prematuro con DerbyDB? ¿Madurez?
simgineer
2

Me doy cuenta de que mencionó la exploración de SQL, pero todo lo demás en su pregunta me hace querer sugerir que también considere DB4O , que es una gran base de datos de objetos simple .

Fabian Steeg
fuente
Gracias. DB4O se ve bien para un proyecto tan pequeño, pero creo que la capacidad de explorar y editar datos fuera de la aplicación es muy importante. ¿También sería fácil manejar versiones más nuevas de clases? (por ejemplo, campos agregados / eliminados)
Hosam Aly
Sí, admite algunas refactorizaciones automáticamente, puede encontrar más información al respecto aquí: ibm.com/developerworks/java/library/j-db4o3.html
Fabian Steeg