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インターフェースの実装クラスを作成して標準型への変
やりたいこと DBへのinsert/update時に登録情報、最終更新情報をコーディング無しで自動更新されるようにする。 entityの日付型はjava8のlocalDatetimeを使用する。 登録/更新者はログイン情報から取得する。 thymeleafをlocalDatetimeに対応させる。 JPAのjava8日付型対応 登録/更新日にjava8日付型を使用したいので設定をします。 Spring Data JPAでは設定をしないと日付型を使用できないようです。 詳しくはコチラ。大変参考になりました。 Spring Boot環境でJava8日付型(JSR-310)を使うための設定 @SpringBootApplication @EntityScan(basePackageClasses = {Application.class, Jsr310JpaConverters.class})
これはJava EE Advent Calendar 2013の21日目 昨日は[twitter:@Hachiro808]さんのThymeleafを業務で使いたいでした。 皆様はJPAのL2キャッシュというものをご存知でしょうか。 L2キャッシュとは エンティティをキャッシュし、複数のスレッド間でエンティティを使ってデータをやりとりする場合にいちいちデータベースにアクセスしなくて良くするためのキャッシュです。 普通にエンティティのキャッシュです。ちなみにL1キャッシュというのもありまして、そちらは同じスレッド内で同じエンティティを取得する場合に毎回DBにアクセスしに行かなくて良くするためのキャッシュです。 詳しくはOracleの人が書いた資料があったのでそちらを参照してください。 JPAのキャッシュを使ったアプリケーション高速化手法 超クセモノなL2キャッシュ とまあ、字面だけ見ると非常に
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 インスタンスをキャッシュするからです。 この章では、こ
ただ、これだけではバインドされた変数の値は分かりません。こちらは conf/application.conf と log4j.properties に Hibernate のオプションを指定することで出力することができます。 # You can even specify additional hibernate properties here: # hibernate.use_sql_comments=true # ... hibernate.show_sql=true hibernate.format_sql=true hibernate.use_sql_comments=true log4j.logger.org.hibernate=INFO, hb log4j.logger.org.hibernate.SQL=DEBUG log4j.logger.org.hibernate.type
PostgreSQL に対し、 JPA のエンティティからテーブルを自動生成して ID 列を自動採番する方法を試してみました。 今回は Spring Boot 1.3.0 を使っています。 JPA 実装は Hibernate 4.3.11.Final のようです*1。 JPA のエンティティがこんな感じ。 @Entity @Table(name = "account") public class Account { @Id @SequenceGenerator(name = "account_id_gen", sequenceName = "account_id_seq") @GeneratedValue(strategy = GenerationType.IDENTITY, generator = "account_id_gen") private Long id; @Column(nu
This section provides answers to some common ‘how do I do that…’ questions that often arise when using Spring Boot. Its coverage is not exhaustive, but it does cover quite a lot. If you have a specific problem that we do not cover here, you might want to check stackoverflow.com to see if someone has already provided an answer. This is also a great place to ask new questions (please use the spring
システムによって全テーブルに共通したカラムが存在することがあると思います。 (楽観ロック用のバージョニングカラムや登録日、更新日、登録者名、更新者名など) JPAのEntityクラスを作成するときに全Entityに同じ変数を作るのはイヤだったので、上位クラスを作ってまとめられないかな、と思って調べてみたらその方法がありました。 上位クラスに@Entityではなく@MappedSuperclassアノテーションをつけるだけです。 これだけで、上位クラスを継承したEntityクラスで共通カラムを使用することができました。 package jp.co.test.entity; import java.io.Serializable; import java.util.Date; import javax.persistence.Column; import javax.persistence.M
業務アプリケーションを作っていると、監査証跡ということで、作成者、作成日時、更新者、更新日時を保存するということがあると思います。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
リリース、障害情報などのサービスのお知らせ
最新の人気エントリーの配信
処理を実行中です
j次のブックマーク
k前のブックマーク
lあとで読む
eコメント一覧を開く
oページを開く