H2の進化-組み込みデータベースのウィンドウ関数、CTE、JSON / XML

PostgreSQL / Elasticsearchなど、商業的に成功した主流になったオープンソースプロジェクトがあります。 その他、たとえばRethinkDBは市場を失い、開発を停止しました。 そして、Javaで記述された組み込みデータベースのH2データベースプロジェクトは、そのニッチで開発され、生きています。









SonarQube、Jira、Confluenceの機能を実証するために、最初の起動時にH2データベースが使用されます。 H2は、ほとんどすべてのJVMプロジェクトで、メモリ内でSQLテストを実行するためのベースです。 ユーザーにはあまり知られていないアプリケーションの例があります。これは、分散ignite-sqlでのH2の使用であり、これはすでに別のソリューションの一部として組み込みデータベースを使用するための実動準備スクリプトです。 1か月未満前に、バージョン1.4.199がリリースされ 、かなり複雑なSQLクエリを記述できるようになりました。



プロジェクトでは、データをディスクに保存する完全なデータベースとしてH2に依存することはありませんでした。 むしろ、JVMメモリ内のデータ変換モジュールとして、優れたSQLサポートを備えています。 しかし、このアプリケーションでは、 ウィンドウ関数が不足しているため、大幅に制限されていました。 そして今、 機能の開発が始まってから半年以上が経過した今、H2databaseはSQLiteに追いついています。 これは、イルクーツクのYevgeny Ryazanovの優れた功績によるものです。以前の非商用オープンソースプロジェクトのような開発ペースは見たことがありません。 また、他のロシア語を話す貢献者のコミットがプロジェクトリポジトリに定期的に表示されます。 そして、リリースの瞬間に-プロジェクトの創設者トーマス・ミューラー



H2は、 再帰クエリ(CTE)をサポートしています。 これは、テーブル内の階層データとクエリ分解を処理するSQLの標準的な方法です(ここでは、スケジューラのすくいを踏んでください)。 再帰クエリについては、出版物に例が記載されています。



構造化されていないデータを操作するために、 SQL / JSON標準の今後の実装が将来のバージョンで登場します。 その間、 BaseXベースのプロセッサを備えたXQuery 3.1のカスタム関数を使用して、ニーズに合わせてH2を拡張しました。 コードはgithub H2XQueryAdapterプロジェクトで利用可能です。 これは、XQueryを使用してXMLまたはJSON形式からデータを抽出し、関数によって返される値の非ヌルのタイプと制限を確認できるテーブル関数です。 さらに、XQuery変換の結果をJVMプロセスメモリに変換するために、SQL式の全機能を利用できます。



xquery()テーブル関数はオーバーロードされ、2つのオプションがあります。1つはxQueryクエリ、もう1つはxQueryクエリ、2つ目はsqlクエリ文字列で、xQuery自体のパラメータを形成します。



このような変換を伴うアプローチは、生物医学データストレージプロジェクトでペタバイト単位の生データを処理するプロジェクトで優れていることが証明されました。



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>')
      
      





この実装には、xqueryクエリの形式に制限があります。





列データ型の解析では、H2のSQLパーサーを再利用しようとしましたが、データベースとセッションを作成せずに動作することを拒否したため、他のデータベースオブジェクトと非常に強力に接続されていました。 開発者がアプリケーションの設計を簡素化し、BNF文法のすべての場面でパーサーを作成しないようにしたという思いを私は慰めます。



この例をJavaデバッグモードで実行できます。 新しい変換ルールは、使い慣れたxqueryエディターまたはオープンソースのBaseX GUIで開発できます。



ほとんどすべてのJavaコレクションまたはPOJOを仮想H2テーブルに変換することが可能です。 githubのH2POJOTableプロジェクトコード 。 この例では、参照により、プラットフォームベースのMemoryManagerMXBeansがH2テーブル関数に変わります。 おそらく、このアプローチは、LINQの欠如と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); } }
      
      





H2の古い機能が機能しなくなることがあり、ユーザーからそれほど要求されないことがあります。 例として、私の作業プロジェクトでは、プログラムはAWS S3 URLからデータを読み取ります。 したがって、 プルリクエストを受け入れることで、既知のエラーが解決されることを願っています。 このエラーを修正する方法として、TLSの不安定なテストがありますが、これもJava 11では機能しません。



H2では、 PostgreSQLのネットワークプロトコルのサブセットをエミュレートするODBCドライバーを使用できます。 理論的には、PostgreSQLのFDWを介してバインドすることもできます。



データベース自体に加えて、H2の配信には、編集時の自動補完、サーブレットまたはスタンドアロンの起動オプションをサポートする最小限のWebコンソールも含まれています。 H2は、開発者にとって「スイスナイフ」のように見えます。プロジェクトですでにJVMを使用している場合は、コンパクトで汎用性の高いツールです。 「曲がった」jdbcドライバーでこのコンソールを使用しようとすると、DBMS Redshiftはプロジェクトに最初の赤い目のプル要求を行いました。 プロジェクト参加者の1人であるNoel Grandinは、コードのレビューを手伝い、修正を受け入れました。



Berkeley DB Java Editionの類似物が必要な場合-プロジェクトにはMVStoreがあります -キーバリューデータの永続ストレージであり、MVCCと組み合わせて、データベースの最近のバージョンではデフォルトで「エンジン」です。 データベースがジオファンクションフルテキスト検索の基本的なサポートさえ持っていることは驚くべきことです。



H2databaseの貢献者のおかげで、誰もがこのデータベースを使用してエラーを報告しています! H2データベースは2005年から開発されており、現在、ウィンドウ関数、再帰クエリをサポートしています。これは、JVMメモリ内のデータを処理するための最も強力なSQL「エンジン」の1つです。



All Articles