4. JDOでの永続化処理

4. JDOでの永続化処理

KVSにアクセスするプログラムに、JDOとLow-Level APIとで、どのような違いがあるのか。これを、比較します。最初に、JDOを使った例を示します。次に、Low-Level APIを使った例を示します。

リスト2: JDOでの永続化

package jdoajax; 
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.TimeZone;
import java.util.List;
import javax.jdo.Query; 
import javax.jdo.PersistenceManager;
public class msgBean {
	PersistenceManager pm = PMF.get().getPersistenceManager(); //(1)
	public String addMsg(String uname, String uemail, String umsg) {
		Date date = new Date();
		SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日:HH時mm分ss秒");
		sdf.setTimeZone(TimeZone.getTimeZone("JST"));		
		msg bbs = new msg(uname, uemail, umsg, sdf.format(date)); //(2)
		try {
			pm.makePersistent(bbs); //(3)
			return "登録成功";
		} catch(Exception e){
			return "Error = " + e;
		} finally {
			pm.close(); //(4)
		}
	}
}

リスト2は、JDOを使った、永続化処理プログラムです。永続化処理に関係する部分には、(1)から(4)までのコメントを付けています。JDOで永続化処理を行う場合、最初に(1)のように、永続化マネージャのインスタンス(pm)生成を行います。

次に、(2)のデータ・クラス定義のインスタンス(bbs)生成時に、コンストラクタで永続化データをセットし、(3)でbbsを引数にとってmakePersistentメソッドを実行します。これにより、永続化が行われます。

ただし、こうして作った永続化の内容を、不可逆な内容として確定させるのは、(4)のcloseメソッドの実行によります。

JDOを使った場合、永続化処理は決して複雑ではありませんが、データ・クラス定義(msg)のインスタンスを使って永続化処理が行われており、スキーマに類似したデータ・クラスの定義に依存した処理内容になります。

5. Low-Level APIでの永続化処理

リスト3: Low-Level APIでの永続化

package jdoajax;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;
import java.util.TimeZone;
import com.google.appengine.api.datastore.DatastoreService;
import com.google.appengine.api.datastore.DatastoreServiceFactory;
import com.google.appengine.api.datastore.Entity;
import com.google.appengine.api.datastore.FetchOptions;
import com.google.appengine.api.datastore.Query;
public class msgBean {
	DatastoreService ds = DatastoreServiceFactory.getDatastoreService(); //(1)
	String out = "";
	public String addMsg(String uname, String uemail, String umsg) {
		Date date = new Date();
		SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日:HH時mm分ss秒");
		sdf.setTimeZone(TimeZone.getTimeZone("JST"));
		try {
			Entity m = new Entity("msg"); //(2)
			m.setProperty("uname", uname); //(3)
			m.setProperty("uemail", uemail); //(3)
			m.setProperty("umsg", umsg); //(3)
			m.setProperty("udate", sdf.format(date)); //(3)
			ds.put(m); //(4)
			return "登録成功";
		} catch(Exception e){
			return "Error = " + e;
		}
	}
}

リスト3は、Low-Level APIを使った永続化処理です。データ・クラスの定義はありませんが、この場合もシンプルな処理内容で永続化が可能です。

(1)から(4)のコメントを付けた部分で、永続化処理を行っています。Low-Level APIの場合、最初に(1)のファクトリ・メソッドで、DatastoreServiceのインスタンス(ds)を生成します。次に(2)で、データ・ストア・エンティティのインスタンス(m)を生成した後、(3)のsetPropertyメソッドを使います。ここでは、第一引数のプロパティ名に対応する値を、第二引数でセットします。

(3)setPropertyメソッドは、キーとその値の形でのセットになっています。「uname」(ユーザー名)、「uemail」(メールアドレス)、「umsg」(書き込みメッセージ)、「udate」(日本時間での書き込み日時)をセットしていますが、このあとの(4)でインスタンス(m)を引数に指定してputメソッドを実行すれば、永続化処理が行われます。

このサンプルでは、JDOのような、コンストラクタによる永続化データのセットは行いません。(2)を見て分かる通り、永続化のプロパティ項目をそれぞれセットしていることから、ステップ数はやや増えていきますが、とりたてて複雑な処理になるという事でもありません。

永続化対象のプロパティ項目は、データ・クラスの定義を行わずに設定します。このことから、リスト2の(3)で行っているプロパティ項目定義を、別のものに変えてしまうことが可能なようにも思えます。実際、その通りです。Low-Level APIでは、同じkind(≒レコード)に属するエンティティ間で、キー項目を除くプロパティ項目は、全く任意に変えることができます。

次回は、同一のkindに対して、永続化対象となるプロパティ項目を変えながら永続化を行うプログラムを作成し、解説します。

人気記事トップ10

人気記事ランキングをもっと見る

企画広告も役立つ情報バッチリ! Sponsored

ClickHouse Cloudが実現した広告運用SaaS「ATOM」のデータ基盤革新、パフォーマンスを向上しながら、運用負荷とコストを削減 11月11日 6:20 AIで開発が加速する時代、品質保証はどう変わる? Tricentisが示すAIエージェント活用の実像 11月9日 6:45 悪用までの猶予が「1分」に迫るフロンティアAI時代に開発と本番を貫く脆弱性管理が必要 10月29日 8:30 欧州CRA対応とSBOM運用。AI生成コードのOSS混入問題の対策とは ――スニペット単位で検出する「FossID」「Insignary Clarity」によるSBOM運用 9月16日 6:40 PostgreSQLからTiDBへ、稼働中SaaSで進める段階的DB移行の実践と再設計への展望 9月7日 6:30 機能安全開発におけるGoogleTestの活用を支援!「Parasoft C/C++test CT」で実現する効率化&AI連携 4月14日 6:30 【CNDW2025】Grafanaが明かす「オブザーバビリティの哲学」ー最小限の労力で実用的なインサイトを得るには 1月23日 6:30 【CNDW2025】プロダクト急増に備える基盤刷新 ーウェルスナビがECSからEKSへの移行で得た知見とは 1月15日 6:30 【CNDW2025】250環境を5人で運用、構築時間は30分に ーKINTOテクノロジーズが語るインフラ基盤組織の作り方 2025年12月18日 6:30 新たな自動化で熱視線! AIエージェントの「推論能力」を支える2つのコンポーネントとは? 2025年11月28日 6:30