Speedmentが,ストリームベースのオブジェクト-リレーショナルマッピング(ORM)Javaツールキットとランタイムアプリケーションのバージョン3.0.1(コードネーム“Forest”)をリリースした。“speed”と“development”の複合語を社名として2015年に創設されたSpeedmentは,複雑なORMを排除し,データベースとの接続構成とデータ操作実行に関するプロセスを抽象化することによる,データベースプログラミングの促進を目標として掲げている。
新機能には次のようなものがある。
- JPAスタイルの永続化
- データベース操作のための宣言型Java 8ストリームAPI
- コード生成の改善
- プリミティブ型のサポート
- ロギング改善
- ユーザインターフェースの改善
- バージョンチェック
- 潜在的問題の強調表示
- コンソール出力の改善
- データベースからの“リロード”マージの改善
- テーブル毎にパッケージ名を設定可能
- プリミティブフィールドへのマッピング
- 新たなMavenゴール - “clear”と“reload”
オープンソース版では以下のデータベースがサポートされる。
Oracleなどの商用データベースはSpeedmentエンタープライズエディションでサポートする。
始めに
以下のコマンドにより,Mavenと既存のMySQLデータベースを使用した Speedmentアプリケーションのビルドが起動する。
mvn archetype:generate -DgroupId=org.redlich.publications
-DartifactId=publications -DarchetypeArtifactId=speedment-archetype-mysql
-DarchetypeGroupId=com.speedment.archetypes -DinteractiveMode=false
-DarchetypeVersion=3.0.1 && cd publications && mvn speedment:tool
このコマンドは,-DartifactID
で指定されたサブディレクトリを生成してそこにディレクトリを変更し,以下に示すようなSpeedmentツールを起動する。
データベース名を入力後,“Connect”ボタンでMySQLデータベースに接続し,次に示すようにスキーマをインポートする。
プロジェクト情報をカスタマイズした後,“Generate”ボタンによってデータベーステーブル用のソースコードを生成すると,データベース操作の宣言型Java 8ストリームコードを記述するための汎用のMain.java
コードが編集用に用意される。
データベースがPostgreSQLとMariaDBの場合には,コマンドラインの以下のパラメータを対応するものに置き換える。
-DarchetypeArtifactId=speedment-archetype-postgresql
-DarchetypeArtifactId=speedment-archetype-mariadb
データベースを操作するコードを記述していない状態でも,プロジェクトはすでにコンパイルおよび実行が可能だ。
mvn compile && mvn exec:java -Dexec.mainClass="{package}.Main"
SpeedmentのAPIクイックスタートのページには初期化や永続化,更新,結合といった,Java 8のストリームコードの例が紹介されている。GitHubリポジトリには,完全なサンプルプロジェクトも提供されている。
CTOのPer-Åke Minborg氏に,Speedmentの最新リリースについて話を聞いた。
InfoQ: Speedmentでのあなたの役割について教えてください。
Minborg: Speedmentの共同創設者兼CTOとして,Java関連の技術開発とSpeedmentコミュニティとの関与をリードしています。
InfoQ: SpeedmentがHibernateやJOOQ,Apache Torqueといった他のORMフレームワークと違うのは,どのような部分なのでしょう?
Minborg: Speedmentは,既存のリレーショナルデータベースと最新のJava 8ストリームベースのアプリケーションとをシームレスに結び付けるにはどうすればよいか,という疑問に答えるものです。必要なデータ操作をすべて宣言的なストリーム操作で表現すれば,生成されたデータパイプラインのどの部分をデータベースエンジンが処理して,どの部分をJVMに残すべきなのかを,Speedmemtフレームワークが決定してくれます。これによってJavaアプリケーションのコードでは,クエリ言語を用いなくても,複雑なデータ操作を扱うことができるようになります。データベースのデータモデル内の変更は,自動的にJavaアプリケーションに通知されます。データベースのデータに対するインターフェースは自動生成コードなので,将来的なデータベースモデルの変更によって生じるデータベースとアプリケーションとのミスマッチを,コンパイラを使って検出することが可能です。https://dzone.com/articles/declarative-programming-with-speedment-30で詳しく述べられているように,アプリケーションデータ処理のJava部分は,Speedment以前には聞いたことのない,宣言的な方法で行なうことができます。
対照的にHibernateでは,SQLに非常によく似たHQLでデータベース問合せを表現するので,Hibernateを使用するJava開発者は,データベースと通信するための特別な言語を駆使しなくてはなりません。そのため,やがてデータベースモデルが拡張されていくと,実行時にアプリケーションコードに何らかのミスマッチが発見されることになります。2つの言語を使用することはエラーを起こしやすいですし,メンテナンスコストも高くなりがちです。さらに,JavaとHQLの間にある言語の壁は,ストリームが実現するJava 8の関数型プログラミングパラダイムの宣言的性質の目的を否定するものでもあるのです。この概念的に重要な差異の詳細については,こちらでも議論されています - https://dzone.com/articles/streams-in-hibernate-and-beyond
HibernateではJava開発者がクエリ言語を使わざるを得ないのに対して,jOOQでは,Javaから実際のSQLコードを明示的に構築することが可能になります。この目的においては,多くの面でHibernateよりもエレガントですが,Speedmentでは抽象化されているクエリ言語に重きをおいているという点では,Hibernateと大きな差はありません。
Apache TorqueはデータがJavaやSQLではなく,XMLでモデル化されていることを前提としています。スクラッチから開始されるプロジェクトであれば,永続化に関して,生成されるSQLデータモデル自体にはほとんど,あるいはまったく関心を持つ必要はないのですが,データモデルがデータベースエンジンの外部で表現されるため,既存のリレーショナルデータベースからのクリーンなマイグレーションパスは期待できませんし,データベース特有の機能を活用する手段もなくなります。
Javaコードからクエリ言語を抽象化することによるもうひとつの特徴は,Speedmentフレームワークのコンフィギュレーションによって,Javaアプリケーションのコードを変更しなくても,例えばJVMメモリデータストアなど別のデータソースを使うことが出来る点です。これはSpeedmentの“Insane Mode”の効力です - Javaアプリケーションの基盤となるSpeedmentのデータ処理パイプラインでは,データに何をしたいのかを記述するだけでよいのです。どうやって行なうのかは,Speedmentフレームワークが適切に判断してくれます。この自由度を活用して,Javaアプリケーションロジックに影響を与えることなく,データの取得方法を変更することが可能になります。クエリ言語ベースのフレームワーク上に構築されたアプリケーションでは,データ取得の特定のモードに縛られざるを得ないので,このようなことは実現できません。
InfoQ: Speedment Enterpriseへの投資が推奨できるのは,どのような状況の開発者や組織に対してでしょうか?
Minborg: Speedment Open Sourceはオープンソースのデータベースが対象です。Oracleなどのエンタープライズデータベースを所有するユーザには,データベースコネクションを含むエンタープライズデータライセンスが必要になります。このライセンスにはサービスとサポートも含まれています。
さらに,Enterpriseライセンスを取得したユーザは,アプリケーションの応答時間を桁違いに向上するSpeedment Insane Mode機能を利用することができます。
また,このライセンスにはIn-JVMデータテクノロジが含まれており,パフォーマンスボトルネックを回避することが可能です。
InfoQ: Speedmentを使用しているパートナやユーザについて教えて頂くことはできますか?
Minborg: 数千人のオープンソースユーザが世界中にいます。Speedment Enterpriseは通信や銀行,保険,エネルギ,物流関係など,いくつかの分野で使用されています。パートナやユーザとしては,Vaadin,Sencha,Higher Frequency Trading,Extremely Heavy Industriesなどがあげられます。
InfoQ: 今後の計画について教えてください。
Minborg: 体験版にさらに多くの機能を追加して,ソフトウェアのテスト環境を開発者に無償提供したいと考えています。In-JVM-Memory Insane Modeを開発者ライセンスの一部にすることも,その中のひとつです。
Spring BootやVaadinとの統合も追加する予定です。データソースを拡充するためのコネクタの追加も続けていきます。そしてもちろん,Java 9をサポートします。
この記事を評価
- 編集者評
- 編集長アクション