1

終了する直前に、クラスのmainメソッドを実行するために新しいデーモンプロセスを実行する必要があるアプリケーションを開発しようとしています。

メインアプリケーションが終了した後も、デーモンプロセスが実行中である必要があります。

これはOracleDBで実行されるJavaストアドプロシージャであるため、ファイルシステムファイルではなくデータベース構造で定義されているため、オペレーティングシステムシェルからJavaクラスを見つけることができないためRuntime.execを使用できません。

特に、望ましい動作は、リモートデータベースセッション中に次のことができるようになることです。

デーモンプロセスを実行し、デーモンプロセスを実行状態のままにして終了する最初のJavaメソッドを呼び出します

そして(最後の呼び出しが終了したため、デーモンプロセスとセッション制御を実行します)結果的に

デーモンプロセスと通信するメソッドを呼び出します(通信の最後に最終的に終了します)

これは可能ですか?

ありがとう

アップデート

ホストに、JDBC-11Gociドライバーを使用してOracle11gR1DBに接続するJavaJDK6クライアントアプリケーションからのファイル転送サービスがない場合、大きなテキストファイルを作成してデータベースにロード(最高のパフォーマンスを実現)する必要があります。

入力として与えられたLOB(ラージデータベースオブジェクト)をファイルに格納するプロシージャを呼び出すことで、実用的なソリューションをすでに開発しましたが、そのようなメソッドは、避けたい中間構造が多すぎます。

そこで、最初の呼び出しでDB上にServerSocketを作成し、後でそれに接続して、直接高速通信でデータ転送を確立することを考えました。

私が遭遇した問題は、ServerSocketを作成するJavaプロシージャが終了できず、そのソケットとクライアントで実行中のスレッド/プロセスをリッスンしたままにして、ServerSocketが作成されたことを確認するために別のスレッドを実行できないために発生します残りの仕事を処理します。

明確になりたい

4

3 に答える 3

1

これが可能だったら驚きます。事実上、DBServerマシンを無数のデーモンプロセスで飽和させることができます。

そのようなことが可能である場合、その手法はOracle固有である可能性があります。

おそらく、データベーストリガー、または他のそのようなイベント駆動型データベース機能を使用して、目的の効果を達成できます。

解決しようとしている問題を正確に説明することをお勧めします。なぜデーモンが必要なのですか?私の本能は、デーモンの寿命を管理しようとすると、ひどく複雑になるだろうということです。2つのインスタンスの起動の防止、デーモンの予期しない終了、メンテナンスが必要な場合のデーモンの停止などの問題に対処する必要がある場合があります。この種のものは本当に厄介になる可能性があります。

たとえば、1時間ごとにJavaコードを実行したい場合は、ほぼ確実に、その効果を実現するためのより簡単な方法があります。オペレーティングシステムとデータベースには、必要なときに作業を開始するための優れた方法がある傾向があります。したがって、必要なときにストアドプロシージャを呼び出すことは、おそらく環境にすでに存在する機能です。したがって、必要なのは、ストアドプロシージャに目的のコードを配置することだけです。shceduling、initiation、およびmanagementを手作りする必要はありません。このアプローチの非常に重要な利点の1つは、環境内の他の人々がすでに理解している技術を使用することになることです。

検討している種類のコードを書くことは非常に興味深く、とても楽しいですが、商業環境ではしばしば努力の無駄です。

于 2010-06-19T09:13:54.597 に答える
0

他の Main クラス用に別の jar を作成し、メイン アプリケーション内で、他の Main クラスを実行する外部プログラム (別の JVM) を実行する Runtime.getRuntime().exec() メソッドを使用して jar を呼び出します。

于 2010-06-19T09:19:55.387 に答える
0

Java でサブプロセスを開始する方法はRuntime.exec()(または、より便利なラッパーであるProcessBuilder) です。それがうまくいかない場合、ネイティブ コードを使用して同等の機能を実装できない限り、あなたは SOL です (C++ レベルでサブプロセスを開始する方法については、ここで別の質問をしてください)。標準的な方法。

Oracle のようなアプリケーション サーバーで、サブプロセスを開始する機能またはネイティブ コードをロードする機能のいずれかにアクセスできるとしたら、私は驚きます。どちらも多大な害を及ぼす可能性があるため、信頼できないコードは禁止されています。あなたの編集を見てみると、あなたの最善のアプローチは、実際の問題に取り組む方法を再考することです。たとえば、NIO を使用してより効率的な方法でソケットを管理します (そして、ディスク上に余分なファイルを作成しないようにします。それらをクリーンアップするために余分な精巧なコードを挿入する必要があります…)

于 2010-06-19T12:15:05.447 に答える