サクサク読めて、アプリ限定の機能も多数!
トップへ戻る
掃除・片付け
beyondseeker.hatenadiary.org
LRU(Least Recently Used)アルゴリズムを持つ Map を作成する場合、LinkedHashMap を使うとラクチンです。 LRU アルゴリズムの実装方法 removeEldestEntry(java.util.Map.Entry) メソッドをオーバーライドするだけで、LRU アルゴリズムを持った Map になります。put 時にこのメソッドがよばれ、true を返すと最も長時間アクセスされていない要素が削除されます。ということで、 return size() > maxEntries; のように戻り値を設定するだけで、最大サイズが maxEntries の LRUアルゴリズムを持った Map となります。 get時の振る舞い 内部的には、二重のリンクリストを保持していて、そのリストを常に、最後にアクセスのあったエントリを先頭にするように保守しています。たとえば、既存の
DIし忘れに注意 実行時に、いきなり NullPointerException 喰らって、それが単なる bean への DI し忘れだとヘコみますよね。 そういうときには、@Required アノテーションによって、コンテキスト起動時に DI の抜けを確認することができます。 ぬるぽの例 前回の beans.xml の userService bean の設定から、あえて entityManager への DI を外してプログラムを動作させると、以下のようなエラーが発生します。 Exception in thread "main" java.lang.NullPointerException at domain.service.UserServiceImpl.registerUser(UserServiceImpl.java:22) at sun.reflect.NativeMethodA
おいらはここ数年 Spring Framework と HibernateEntityManager 環境で開発をすることが多いのですが、動けばいいやー的な方向に流されてるような気がする今日この頃です。 ということで、Spring+HibernateEntityManager 環境について、ステップ・バイ・ステップで確認していこうと思います。 概要 HibernateEntityManager を超ベタに使うサンプルです。 一応基本ということで (^^; 例題 エンティティ A を保存します。 ソース エンティティ A 最低限の情報を持つエンティティです。Simple is Best ということで。 package sample; import javax.persistence.Entity; import javax.persistence.GeneratedValue; import
Google App Engine では負荷の状況によってインスタンスの数を自動的に調整してくれるわけですが、数秒アイドルしただけでインスタンスが落とされるのか、数分程度は許されるのか、興味があるところです。 ということで、GAE/J のインスタンスがどの程度保持されるかの簡単な実験をしてみました。 (詳細は付録に参照のこと) 実行結果 アクセスインスタンスの状態 初回初期インスタンス生成 10秒後初期インスタンスのまま 20秒後初期インスタンスのまま 30秒後初期インスタンスのまま 40秒後初期インスタンスのまま 50秒後初期インスタンスのまま 60秒後初期インスタンスのまま 2分後初期インスタンスのまま 3分後初期インスタンスのまま 4分後初期インスタンスのまま 5分後新規インスタンス生成 10分後新規インスタンス生成 上記の結果から、5分という時間が怪しいですね。 ということで、最終
GAE/J のHeapサイズの上限を実際に測ってみたくて、実験してみた。 実験プログラム プログラムは、以下のようなサーブレットを作っただけ。 private static byte[][] data = new byte[100][]; private static int count = 0; public void doGet(HttpServletRequest req, HttpServletResponse resp) throws IOException { // set content type resp.setContentType("text/plain"); // show memory usage resp.getWriter().printf("maxMemory = %12s\n", new DecimalFormat().format(Runtime.getR
int などへのアクセスとは異なり、long へのアクセスはアトミックな処理ではないため、マルチスレッド環境では排他処理が必要になります。普通に処理排他処理をするのであれば ReentrantReadWriteLock を使いそうなものですが、純粋に long のみをアトミックに扱いたいだけであれば、AtomicLong が使えます。しかし、性能がどの程度異なるのでしょうか。ということで、ベンチマークしてみました。 処理概要 long への read と write を交互に合計100万回行うスレッドを10スレッド並行動作させた時間を計測。 long のテストは、long をフィールドとして持つクラスを作成し、get では ReadLock を使用、set では WriteLock を使用。 AtomicLong のテストは、AtmicLong#get() と AtomicLong#set
UTF-8 のソースからの javadoc 生成でおこられる Eclipse から javadoc を起動する際、ソースファイルをシステムのデフォルトエンコーディングで読み込もうとします。おいらの環境ではシステムのデフォルトエンコーディングが MS932 なのですが、ワークスペースのデフォルトエンコーディングを UTF-8 にしているため、javadoc 生成時におこられてしまいます。 javadocのオプション javadoc には、エンコーディングに関して以下のようなオプションがあります。 オプション 効果 -encoding ソースファイルのエンコーディングの名前 (EUCJIS/SJIS など) を指定します。このオプションが指定されていない場合は、プラットフォームのデフォルトコンバータが使われます。 -docencoding 生成される HTML ファイルのエンコーディングを指定
フル J2EE コンテナを使わずに SpringFramework だけ利用する場合って、 JNDI を前提にされると結構めんどくさいことがありますよね。 たとえば、UserTransaction を JNDI 経由で取得するのが前提の場合とか。 そんなとき、xbean-spring の SpringInitialContextFactory が便利です。 xbean-spring を使うと、Spring の bean 定義ファイルを元に BeanFactory を生成し、任意の bean を JNDI 経由で公開することができます。 XBean project XBean project は、Apache Geronimoのサブプロジェクトらしいです。 http://geronimo.apache.org/xbean/ おいらは maven のリポジトリから xbean-spring の
前回のおさらい 前回は、@Component アノテーション、@Scope アノテーション、context:component-scan 要素を用いて、Entity のパッケージ以下の各クラスを bean として自動登録しました。その実際の記述は以下のようになります。 @Component("user") @Scope("prototype") 不満点 @Component に value を渡すことについて やっぱイヤだなぁ。 @Component に名前を渡すということは、コンポーネント名をドメインモデルの実装内で指定することになります。 しかし、ドメインモデル内部にあるエンティティという視点からは、同一アプリケーション内で共存するコンポーネント名を知る術はありません。 なぜなら、ドメインモデルをここねこねしてアプリケーションを構築するのは、アプリケーション層の責務だからです。 そして
今回は、Spring+HibernateEntityManager(AspectJ AOP with Load-Time-Weaver編)の続きです。 コネクションタイムアウトのハンドリング忘れてた(^^; 以前、beans.xml に DBCP の設定は行いましたが、コネクションタイムアウト対策を忘れていました。 おいらは DB に MySQL を使用しているのですが、MySQL はデフォルトでは 8 時間でコネクションがタイムアウトするようになっています。そうすると、コネクションプールからコネクションを取得しても、それがタイムアウトしているという悲しいことになります。(´・ω・`) Connector/J の autoReconnect は、おいら的には非推奨。 Connector/Jのマニュアルには、非推奨と書かれてます。 おいら的にも、めんどくさいことこのうえないので、使わないほう
Hibernate では2次キャッシュ(query cache と collection cache 含む)を提供していますが、キャッシュプロバイダ実装の選定とか、実案件への適用ポリシー等についてはユーザーにお任せですよね。自由度が高いというメリットはあるけど、自由を持て余してしまうかもしれません。 ということで、利用者の視点で、少し考えてみようと思います。 本家の情報 ひとまず、以下に Hibernate 本家のキャッシュに関する情報をまとめてみました。 Hibernate Core 3.4.4. Second-level and query cache 19.2. The Second Level Cache 19.3. Managing the caches 19.4. The Query Cache 19.6.2. Metrics 24. Best Practices Hibern
TransactionsEssentials は、Atomikos のフリーの JTA 実装です。 とりあえずインストールしてみた。 サイトからダウンロードして、dist フォルダから必要な jar ファイルを選び、クラスパスに通します。 とりあえず、以下の jar があれば、最低限の JDBC 操作は行えます。 transactions-jta.jar transactions-jdbc.jar transactions-api.jar atomikos-util.jar transactions.jar SpringFramework で適当に定義してみた。 環境は、MySQL のインスタンスを2つ用意してみました。 beans.xml <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframe
ソース中に $Id$とか入力すると、Subversion 側で勝手に $Id: OfCache.java 23 2008-05-06 13:24:45Z beyondseeker $のように変換をかけてほしい場合があります。CVSではたぶんデフォルトでキーワード変換をしてくれたと思うのですが、SVNでは明示的な設定が必要です。 コマンドライン コマンドライン的には、以下のように設定します。 $ svn propset svn:keywords "<空白区切りのキーワード>" <対象ファイル> Eclipse(Subclipse)の場合 以下から設定します。 [Team] -> [プロパティの設定...]プロパティ名: svn:keywordsプロパティの内容(例): Date Revision Author Id 変換例 Sourceforgeのリポジトリに、Eclipse上のSubcli
任意の情報を独自プロトコルの URL で指定したいなぁと思い立った今日この頃。 たとえば、hogeプロトコル。 hoge://example.com/foo/barとか。 でも、URL って基本的に http プロトコルくらいしか使わんですよねー (´・ω・`) たとえば http://www.yahoo.co.jp のテキストを取得するとか。(以下 Groovy の例)*1 new URL("http://www.yahoo.co.jp").text では、http や ftp のようにデフォルトの実装が存在しないプロトコルはどのように扱うんだろ? たとえば、DB内の情報検索で oreoredb://example.com/user?userId=10とか、 sum://a,bで a と b の和を返すとか。 ということで、ちょっと調べてみました。 URLクラス まずは、 URL クラス
xmlファイルによるトランザクション設定 前回までの設定では、トランザクションの設定は、beans.xml ファイルの以下の箇所で行っています。 <!-- Transaction Advice --> <tx:advice id="readWriteAdvice" transaction-manager="txManager"> <tx:attributes> <tx:method name="*" propagation="REQUIRED" /> </tx:attributes> </tx:advice> <!-- aop --> <aop:config> <!-- for read-write operations --> <aop:pointcut id="readWriteOperationPointCut" expression="execution(* domain.serv
前回、以下のアノテーションにより、対1関連をフェッチできると書きました。 @OneToOne(fetch=FetchType.LAZY) しかし、単純にそうもいかないケースもあるとも書きました。 これらのケースを、例を追いながら説明し、その後 LoadTimeWeaver を用いた解決方法を示します。 例1 概要 クラス A と クラス B が互いに 1対1関連を持っている。 DB のテーブル上、テーブル A はテーブル B の外部キーを持っているが、テーブル B はテーブル A への外部キーを持っていない。 ソース クラス A @Entity public class A extends EntityBase { @OneToOne(fetch=FetchType.LAZY) private B b; public B getB() { return b; } public void s
select の結果を見やすく成形する。 .header On .mode column 実機上のデータベースデータを読み込む テスト用途限定。 /data 以下のファイルは root 化しなければ読み取ることができないため SD カード上にデータを配置する方式を取る。 AndroidManifest.xml に以下の権限情報を追加する。 <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> SQLiteOpenHelper などに渡すデータベース名を以下のようにSDカード上の任意の場所にする。 Environment.getExternalStorageDirectory () + "/data/mydatabase.db"; データベースが生成されると以下のようにdbファイルが確認できる
このページを最初にブックマークしてみませんか?
『Be an Idealistic Realist』の新着エントリーを見る
j次のブックマーク
k前のブックマーク
lあとで読む
eコメント一覧を開く
oページを開く