Hay proyectos de c贸digo abierto que se han convertido en una corriente principal comercialmente exitosa, como PostgreSQL / Elasticsearch. Otros, por ejemplo RethinkDB, perdieron el mercado y detuvieron el desarrollo. Y el proyecto de base de datos H2 de una base de datos integrada escrita en Java se est谩 desarrollando y viviendo en su nicho.
Para demostrar la funcionalidad de SonarQube, Jira, Confluence, la base de datos H2 se utiliza en el primer inicio. H2 es la base para ejecutar pruebas SQL en memoria en casi cualquier proyecto JVM. Hay un ejemplo de una aplicaci贸n menos conocida por los usuarios: este es el uso de H2 en un encendido ignite-sql distribuido y este ya es un script listo para producci贸n para usar una base de datos integrada como parte de otra soluci贸n. Hace menos de un mes,
se lanz贸 la versi贸n
1.4.199 en la que ahora puede escribir consultas SQL bastante complejas.
En proyectos, nunca confi茅 en H2 como una base de datos completa para guardar datos en el disco. M谩s bien, como un m贸dulo para transformar datos en memoria JVM, con buen soporte de SQL. Pero para esta aplicaci贸n, estaba muy limitada por la falta de
funciones de
ventana . Y ahora, despu茅s de m谩s de medio a帽o desde el comienzo del desarrollo de la
funcionalidad , ahora H2database se ha puesto al d铆a con
SQLite . Y esto se debe al gran m茅rito de
Yevgeny Riazanov de Irkutsk: no he visto un ritmo de desarrollo como el suyo antes en proyectos de c贸digo abierto sin fines de lucro. Adem谩s, los compromisos de otros contribuyentes de habla rusa aparecen regularmente en el repositorio del proyecto. Y en los momentos de lanzamiento: el fundador del proyecto
Thomas Mueller .
H2 tiene soporte para
consultas recursivas (CTE) . Esta es la forma est谩ndar en SQL para trabajar con datos jer谩rquicos en tablas y descomposici贸n de consultas (aqu铆 puede pisar el rastrillo del planificador). Las consultas recursivas se describen
en la publicaci贸n con ejemplos.
Para trabajar con datos mal estructurados, aparecer谩 una pr贸xima implementaci贸n del
est谩ndar SQL / JSON . Mientras tanto, expand铆 H2 para mis necesidades con la ayuda de una funci贸n personalizada del procesador XQuery 3.1, basada en
BaseX . El c贸digo est谩 disponible en el proyecto github
H2XQueryAdapter . Esta es una funci贸n de tabla que puede extraer datos del formato XML o JSON usando XQuery y verificar el tipo y la restricci贸n de no nulo para los valores devueltos por la funci贸n. Adem谩s, toda la potencia de las expresiones SQL est谩 disponible para transformar el resultado de una transformaci贸n XQuery en la memoria del proceso JVM.
La funci贸n de tabla xquery () est谩 sobrecargada y tiene dos opciones: con una consulta xQuery de par谩metro y otra con la consulta xQuery y la segunda cadena de consulta sql para formar los par谩metros para xQuery.
Un enfoque con tales transformaciones demostr贸 ser excelente en un proyecto para procesar un volumen de datos en bruto de petabytes en
un proyecto de
almacenamiento de datos biom茅dicos .
create table xresult (GR VARCHAR(500) not null,AR varchar, VER VARCHAR(50)) as select * from xquery('declare variable $getHeader as xs:boolean external := false(); declare variable $getData as xs:boolean external := true(); <csv> { if($getHeader) then( <record><mavengr>VARCHAR(500) not null</mavengr><artifactname>varchar</artifactname><versionname>VARCHAR(50)</versionname></record> ), if($getData) then(( for $row in doc("http://central.maven.org/maven2/org/springframework/spring-context/5.1.4.RELEASE/spring-context-5.1.4.RELEASE.pom")//*:dependency return <record><mavengr>{$row/*:groupId/text()}</mavengr><artifactname>{$row/*:artifactId/text()}</artifactname><versionname>{$row/*:version/text()}</versionname></record> )) } </csv>')
Esta implementaci贸n tiene limitaciones en el formato de la consulta xquery.
Con el an谩lisis de tipo de datos de columna, intent茅 reutilizar el analizador SQL desde H2, pero result贸 estar tan fuertemente conectado con otros objetos de base de datos que se neg贸 a funcionar sin crear una base de datos y una sesi贸n. Me consuelo pensando que los desarrolladores lo hicieron para simplificar el dise帽o de la aplicaci贸n y no para hacer un analizador en todas las ocasiones para las gram谩ticas BNF.
Puede ejecutar
este ejemplo en modo de depuraci贸n de Java. Se pueden desarrollar nuevas reglas de transformaci贸n en el conocido editor de xquery o en la
GUI de BaseX de c贸digo abierto.
Es posible convertir casi cualquier colecci贸n de Java o POJO en una tabla H2 virtual.
C贸digo de proyecto
H2POJOTable en github. En el ejemplo, por referencia, el MemoryManagerMXBeans basado en la plataforma se convierte en una funci贸n de tabla H2. Quiz谩s el enfoque ser谩 un poco de consuelo para aquellos que est谩n tristes por la falta de LINQ y soporte para operaciones en sets en Java.
try (Statement statement = connection.createStatement()) { String pojoTableAlias = "create alias MemoryManagerMXBeans as $$ \n" + "import java.lang.management.ManagementFactory;\n" + "import java.lang.management.MemoryManagerMXBean;\n" + "import org.h2.expression.function.pojo.*;\n" + "import java.sql.*;\n" + "import java.util.Collections;\n" + "@CODE\n" + " ResultSet getRuntimeStat(Connection connection) throws Exception{\n" + " return H2PojoAdapter.toTable(connection, new CollectionWraper<>(MemoryManagerMXBean.class," + " ManagementFactory::getMemoryManagerMXBeans, Collections.emptyMap()));\n" + " }\n" + "\n$$"; statement.executeUpdate(pojoTableAlias); } try (Statement statement = connection.createStatement()) { try (ResultSet resultSet = statement.executeQuery("select * from MemoryManagerMXBeans()")) { int columnCount = assertResultSet(resultSet, new String[]{"memoryPoolNames", "name", "valid"}); assertThat(columnCount).isGreaterThan(1); } }
A veces, la antigua funcionalidad en H2 se rompe y los usuarios no la exigen. Como ejemplo, en mis proyectos de trabajo, los programas leen datos de la URL de
AWS S3 . Por lo tanto, espero que el error conocido
a煤n se arregle al aceptar mi
solicitud de extracci贸n . En el camino para solucionar este error hay pruebas inestables para TLS, que tampoco funcionan en Java 11.
H2 le permite utilizar el
controlador ODBC PostgreSQL emulando un subconjunto de su protocolo de red. Lo que te贸ricamente tambi茅n te permite vincularlo a trav茅s de FDW en PostgreSQL.
Adem谩s de la base de datos en s铆, la entrega de H2 tambi茅n incluye una consola web minimalista con soporte para autocompletar al editar, servlet o opci贸n de inicio independiente. H2 parece un "cuchillo suizo" para desarrolladores: una herramienta compacta y vers谩til si su proyecto ya utiliza la JVM. Al intentar usar esta consola con un controlador jdbc "torcido", el DBMS Redshift realiz贸 su primera solicitud de extracci贸n de
ojos rojos en el proyecto.
Noel Grandin , uno de los participantes del proyecto, me ayud贸 con la revisi贸n del c贸digo y acept贸 las correcciones.
Si necesita un an谩logo de Berkeley DB Java Edition, el proyecto tiene
MVStore , un almacenamiento persistente para datos de valor clave y, en combinaci贸n con MVCC, el "motor" por defecto en las versiones recientes de la base de datos. Es sorprendente que la base de datos incluso tenga soporte b谩sico para
geofunciones y b煤squeda de
texto completo.
Gracias a los colaboradores de H2database, 隆todos usan esta base de datos e informan errores! La base de datos H2 se ha desarrollado desde 2005, y ahora admite funciones de ventana, consultas recursivas, es uno de los "motores" SQL m谩s potentes para procesar datos en la memoria JVM y se expande mediante funciones de tabla para trabajar con datos estructurados libremente.