JPA(Java Persistence API)は、データベースから取得したデータをメモリ上に保持する仕様になっている。 そのため、不用意に大量のデータを取得すると、メモリ容量を圧迫してしまい、最悪の場合はOutOfMemoryErrorが起きる可能性がある。 本稿では、JPAの標準機能およびネイティブ機能のそれぞれについて、メモリ使用量を抑えながら大量データを取得する方法と、ネイティブ機能がうまく動作しない場合の回避策を紹介する。 JPAは読み込んだデータを一次キャッシュとして保持する JPAは、読み込んだEntityをPersistenceContext(永続化コンテキスト)と呼ぶ領域で管理する。 ここに格納された状態を一次キャッシュと呼び、一次キャッシュされたEntityをManagedな状態(JPAに管理された状態)と呼ぶ(なお、二次キャッシュもあるが割愛する)。 Persist
Springでは既にJava8で導入された新日付型(以下、JSR-310日付型)をサポートしていますが、実際に使用する際には各コンポーネントで設定が必要だったり、フォーマットを指定したかったりするので設定方法をまとめておきます。 サンプルはこちら。 https://github.com/tag1216/example-spring-boot-jsr310 合わせてSpringの各コンポーネントで標準で対応していない型(以下、非標準型)を扱う方法を軽く解説します。 構成 Spring Boot(1.3.0.RELEASE) Spring MVC Spring Data JPA Jackson Spring Data JPA 非標準型の対応方法 Entityクラスやクエリーメソッドの引数で非標準型を使うには、AttributeConverterインターフェースの実装クラスを作成して標準型への変
@Data @Entity @EntityListeners(AuditingEntityListener.class) --(1) public class Vendor implements Serializable { @Id @Column(name="vendor_id") private int vendorId; @Column(name="vendor_name") private int vendorName; @CreatedBy --(2) @Column(name="created_by") private String createdBy; @CreatedDate --(3) @Column(name="created_on") private LocalTime createdOn; @LastModifiedBy --(2) @Column(name="up
JPOUG Tech Talk Night #2 で話した内容に飲み会で質問された内容を加えています。
JPAだけで完結するのはさすがにムリがあったのでこういうタイトルにした。が、JPAプロバイダ固有のAPIのレベルではフェッチサイズを変更する効果を確認できた。 JDBCのsetFetchSize変更時の動きをstatspackで見てみる - kagamihogeの日記ではJDBCを直接使用していたが、このエントリではJPAプロバイダ(EclipseLink, Hibernate)固有のAPIを使用して100万行取得するコードの速度を、フェッチサイズ変更無しと100の時とでどのくらい速度差が生じるかを確認する。 環境 DB CentOS-6.4-x86_64 Oracle Database Express Edition 11g Release 2 Java Java SE Development Kit 7u45 Eclipse Kepler(4.3.1) SR1 IDE for Java
Hibernate を使ってデータベースに100,000行を挿入する愚直な方法は、このようなものです: Session session = sessionFactory.openSession(); Transaction tx = session.beginTransaction(); for ( int i=0; i<100000; i++ ) { Customer customer = new Customer(.....); session.save(customer); } tx.commit(); session.close();これは50,000番目の行のあたりで OutOfMemoryException で失敗するでしょう。 Hibernate がセッションレベルキャッシュで、新しく挿入されたすべての Customer インスタンスをキャッシュするからです。 この章では、こ
業務アプリケーションを作っていると、監査証跡ということで、作成者、作成日時、更新者、更新日時を保存するということがあると思います。Spring Dataのアノテーションを使うと、自動でセットしてくれるので、アプリケーションで決まりきったコードを書かなくて済むということみたいです。 Task.java(モデルクラス) package sample.model; import org.springframework.data.annotation.CreatedBy; import org.springframework.data.annotation.CreatedDate; import org.springframework.data.annotation.LastModifiedBy; import org.springframework.data.annotation.LastMod
@Entityアノテーションと@Idアノテーション @Tableアノテーション @GeneratedValueアノテーション @Columnアノテーション @Transientアノテーション @MappedSuperclassアノテーション 次回は @Entityアノテーションと@Idアノテーション まずは、これが無いと始りません。@Entityは該当のクラスがエンティティであることを指定し、@Idはプライマリキーとなるプロパティかフィールドを指定します。 @Entity public class Customer { @Id private Long id; private String firstname; private String lastname; // ・・ } @Idは以下の様に指定することもできます。というかこっちの方が一般的か? @Id public Long getI
関連エンティティのfetch方法を指定する設定値をデフォルト値から変更した方がよいケースの具体例について。
少し前に検証したものだが、改めて整理。 テーブルAとテーブルBを結合した結果を取得したい場合に、普通にSpring DataのRepositoryを作って@Query のメソッドを定義してもうまくいかない。 例えば以下のようなクエリは表現できない。
リリース、障害情報などのサービスのお知らせ
最新の人気エントリーの配信
処理を実行中です
j次のブックマーク
k前のブックマーク
lあとで読む
eコメント一覧を開く
oページを開く