2011-03-23 14 views
0

jrubyに短時間オブジェクトを格納したいとします。オブジェクトはprocsを使用するので、dbに格納するのに問題があるようです。誰かがjrubyオブジェクトを1〜5分持続させるための良いアイデアを持っているなら、それは素晴らしいことでしょう。Jruby永続性問題

これらのオブジェクトは非常に大きく、特にCelerityブラウザオブジェクトです。今の

、私はそうのようなJRubyのでモデルを作成しました:

class Persist 
    @@persistHash ||= Hash.new 

    def self.storeItem(id, item) 
     @@persistHash[id.to_s] = item 
    end 

    def self.getItem(id) 
     return @@persistHash[id.to_s] 
    end 
end 

私はアプリをwarbledとv2をGlassfishのためにそれを展開しています。

私はプログラムを実行し、しばらくの間うまく動作します。しかし、1日後に、「店」(10-20秒)の直後に「get」と呼ぶと、私は返されません。

ログにエラーが見つかりません。

EDIT:24時間前

Persist.storeItemは()の後、私はアイテムが実際にハッシュテーブル(ハッシュテーブルの挿入時にメモリが不足していなかった)に挿入されていることも発見しましたPersist.getItem()はうまく動作します。

ストアのhttp呼び出し。 getのための別のhttp呼び出しはオブジェクトを返します。 24時間後

Persist.storeItem()Persist.getItem(続く)が正常に動作します。

ストアのhttp呼び出し。 getのための別のhttp呼び出しはnilを返します。

+0

あなたのインスタンスがPersistのスコープを終了するときに破壊されるローカルスコープにあるのだろうかと思います。それを調べましたか? –

+0

正しくインスタンス化する方法がわかりません。私はストアを想定し、静的クラスのメソッドを取得し、私は単に別のモデルやコントローラからPersist.storeItemを呼び出します。 Persistクラスが常にリロードされていたとしても、なぜそれが一日働くのか理解できません。 – Andy

+0

あなたはそうです - @@に気付いたとしても、私はクラスメソッドであることに気づいていませんでした。私の次の考えは、それがいつも再読み込みされていたということでしたが、それが一日OKであれば、私は困惑しています。 23:59と24:01の​​時間にテストしましたか(つまり、24時間マークになっているのでしょうか、それとも0時にリセットされるのでしょうか?) –

答えて

1

いつでもオブジェクトが削除されることはありません。

他のツールを使ってJVMを調べます。メモリを使い果たしてしまった可能性は非常に高いですが、ログメッセージ/例外はメモリの枯渇を報告するために作成されることはありません。

さまざまなヒープ領域のJMX監視を接続して、古いオブジェクトをハッシュできるパブリックメソッドを作成することをお勧めします。

私はあなたのためにもっと持っていました。がんばろう!

+0

ハッシュテーブルに正しく追加されているようです。私はJMXモニターをチェックします。誰かがprocsを持つ大きなjrubyオブジェクトを永続化する良い方法を持っているのだろうか?そこにクールなシリアル化の宝石はありますか? – Andy

+0

確かにメモリリークがありました。どんなログにも何も現れておらず、セットの後で働くことができたのは奇妙なことでした。私はjmap liveをスパムしました:histo | grep 'jruby'そして最終的に私が探していたものを見つけました^^。 – Andy