PostgresMySQLはJDBCからアクセスする時に全件取得するのでバッチ処理が書きづらいという理由でPostgreSQLをインストールしてみました。(フェッチサイズをInteger.MIN_VALUEに設定すれば1件づつの取得になりますが、この間に他のトランザクション走らせることができないので。)(あれ・・・コネクションを2本使えばいいのでは・・?)インストールしたバージョンは8.4.2です。installDB初期化します。--pgdata=/lunar/data/postgres起動します。startスキーマを作ります。-W外部から接続できるように/lunar/data/postgres/pg_hba.confに設定を追加します。md5パスワードを設定しなおしました。'xxxxxxxx';他のホストから接続してみる。postgres手間はMySQLよりも1つ多いくらい。́・ω・)メモリ設定とかDISKのフラッシュ設定とかログ設定とか運用設定とか。JavaJavaのClassLoaderの話をちょっとだけ。意外にClassLoaderを知らない人が居るようです。説明をしますと、クラスローダーにはBootstrapクラスローダーやシステムクラスローダー、コンテキストクラスローダーがあります。(あと拡張クラスローダーですかね)。そんでもって、クラスローダーは親子関係を持っています。委譲モデルと言って、あるクラスローダーにクラスをロードする依頼があると、親に依頼を委譲します。最初に発見されたクラスが実際にロードされるわけです。子クラスローダーBこんなクラスローダーがあるとしてまだロードされていないクラスXをロードしようとした場合は次のように動作します。B.loadClass(X)Aに委譲Bootstrapに委譲BoostrapにXは存在しないAにXは存在しないBにXが存在するのでロードする。ちなみにClassLoader#findClassをオーバーライドして自前の処理で上書きしてしまえば、この委譲モデルを破壊する事ができます。́・ω・)JVMプロセス内においては異なるClassLoaderで読み込んだクラスは例え同じバイナリでも異なるクラスとして扱われます。ClassLoaderAによってロードされたクラスXと、ClassLoaderBによってロードされたクラスXは別物です。※クラスAとBが親子関係を持っていて、AがXをロードしている時にBでロードしても委譲モデルでAが既にロードしてあるXを使うので、こういう場合は同じ定義を指します。TomcatのWebApps1とWebApps2の関係を想像すると理解しやすいと思います。この特性を生かすとリロード処理が実現できるわけです。ClassLoaderの細かい話はDeveloperWorksの記事が丁寧なのでそちらを参照した方が良いです。今回はTomcatにも実装されているリロード処理のサンプルを作ってみたいと思います。TomcatのドキュメントにTomcatのClassLoaderの戦略が書いてあるのでそれを参考にすると分かりやすいと思います。RPCサーバやスケジューラーを考えます。これらを設計する時には大きく二つに分けることができ、RPCサーバではサーバ本体と各命令、スケジューラーでも本体と各タスクという感じです。Tomcatの場合はServletエンジンとビジネスロジックを書いたServlet。(ビジネスロジックはServletに書くものではありませんけどね。)RPCの命令、スケジューラーのタスク、ServletコンテナのServletは抽象化する事ができ、インターフェースを切ることが多いです。(HttpServletとかね。)擬似コードだとこんな感じですね。}}このMyServerとITaskを本体側のClassLoaderに、ITaskを実装したクラスを別のClassLoaderに読み込ませます。本体はCLASSPATHを指定してシステムクラスローダーに読み込ませます。(TomcatはBoostrap用のクラスを挟んでいますけどね。)タスクは独自のクラスローダーをインスタンス化(このオブジェクトをc1とする)して(URLClassLoaderを直接でも良い)、そのClassLoaderを使ってクラス定義を読み込ませます。C言語だとdlopenみたいなイメージです。異なるクラスローダーから読み込んだクラスは別のクラスになるので、リロードしたい場合はClassLoaderをもう1回インスタンス化(c2)してあげればいいのです。文章だけで説明してもアレなので簡単なサンプルを書いてみました。Thread#setContextClassLoaderを使うともっと簡単に書けると思います。サンプルの内容は定期的にタスクを実行するだけのものです。Reload処理はJMX経由で行うようにしました。Eclipse上で作る時はタスククラスは別プロジェクトで作るのが良いです。同じプロジェクトに入れてしまうとシステムクラスローダーによってタスクもロードされてしまうので。Sleepの代わりにSemaphoreを使っている理由はsleepの場合Future#cancelで割り込みが発生しなかったからです。Semaphoreだと割り込みが入ってすぐに終了できます。tasklist.propertiesに登録したいタスクのクラス名を書く必要があります。こんな事をしなくてもLunarClassLoaderに手を加えて特定のインターフェースを実装しているクラスを検索(列挙)すれば良いだけです。今回はそこまで余力がありませんでした。タスク用のクラスパスはソースに直書きしています。自分の環境に合わせて修正してください。VMの引数に-Dhogehogeを指定してシステムプロパティとして読み込むのが一般的な方法かと思います。}}シングルインスタンスモデルにするか、プロトタイプモデルにするか迷ったのでclsMapとかでClass定義を保持しているわけです。今回はシングルインスタンスモデルにしたので実はclsMapは必要ありません。reload();}ここからタスクです。Eclipse上では別プロジェクトにした方が良いです。今回は2つのクラスを登録します。}}クラスパスのルートにtasklist.propertiesを作成します。at.orz.lunar.task.SampleTask1at.orz.lunar.task.SampleTask2実行した後にSampleTask2の内容を変更(★を★★★★★に変更)した後にjconsoleからreloadを呼び出した結果が↓です。́)そしてリ新しいクラスの内容が読み込まれているのも確認できます。※途中から書くのが面倒になったのがソースからわかっちゃうと思いますが、サンプルなので気にしない(・ε・)ただし、このような処理はちょっとミスするとPermGenが解放されずにOutOfMemoryErrorを引き起こす原因になりやすいので気をつけましょー。(IBMのVM使えばいいじゃんとかそういう野暮な事は言わないの。SolrSolr1.4ではとあるURLにアクセスする事でバックアップ(スナップショット)を取れるようになっています。http://wiki.apache.org/solr/SolrReplication↑のSolrのWikiにもあるようにReplicationの機能をONにする必要がありますが、スレーブの設定をしなくても動作するのでマスタのみでもきちんと動作します。以下のURLにアクセスするとデータディレクトリと同列に「snapshot.日時」というディレクトリを作成します。http://master_host:port/solr/replication?command=backupこの時、日付はyyyyMMddHHmmssという書式が指定されているはずなのですが、実はHHがhhになっており、午後の18時に実行しても18にならずに06になってしまいます。SnapShooterというクラスのDATE_FMTの指定を見ると思いっきり小文字で指定されています。