2

リモートサーバー上のMySQLデータベースに接続する必要があるクライアントプログラムを持つJavaベースのプロジェクトに取り組んでいます。これは次のように実装されました。

JDBCを使用して、実行するSQLクエリを記述します。このクエリは、Apache Tomcatを使用してサーブレットとしてホストされ、XML-RPCを介してアクセスできるようになります。クライアントコードはXML-RPCを使用して、これらのJDBCベースの機能をリモートで実行します。これにより、MySQLデータベースを非公開に保ち、事前定義された関数への使用を制限し、Tomcatがデータベーストランザクションを管理できるようになります(MySQLに単独で実行させるよりも優れていると言われていますが、実際にはそうではありません)理由を理解してください)。ただし、このアプローチには多くの定型コードが必要であり、Tomcatはサーバー上で大量のメモリを消費します。

私はこれを行うためのより良い方法を探しています。私が検討している1つの方法は、MySQLデータベースをパブリックにアクセス可能にし、JDBCベースのコードをストアドプロシージャとして書き直し、パブリックな使用をこれらのプロシージャのみに制限することです。これで私が目にする問題は、すべてのJDBCコードをストアドプロシージャに変換するのが難しく、時間がかかることです。また、MySQLの権限についてもあまり詳しくありません。テーブルでselectステートメントを実行するストアドプロシージャへのアクセスを許可するだけでなく、同じテーブルで任意のselectステートメントを拒否することはできますか?

ストアドプロシージャソリューションに関する考えや提案と同様に、他のアイデアも歓迎します。

ありがとうございました!

4

3 に答える 3

0

サーバーの RAM をアップグレードする費用は、数日かかる開発時間よりも少ないコストで入手できる可能性があります。そのため、演習で得られるのがそれだけの場合は、コードを記述しないでください。また、メモリはTomcatの内部で使用されているからといって、Tomcat自体が使用しているとは限りません。メモリは、データまたはコードの技術的な欠陥によって使い果たされる可能性があります。

追加の RAM を試してみて、それが使い果たされている場合は、コーディングの問題のような匂いがするので、プロファイラーを使用するか、データをログに記録して、何かを変更する前に根本的な原因を突き止めることをお勧めします。原因が大規模なデータ セットである場合、データベースを直接使用しても必然的な遅延が発生するだけです。代わりに、ページング、要約、クライアント側のキャッシュ、クライアントの再設計などを検討して、高価なクエリの使用を減らす必要があります。プロファイラーを使用するか、単純にコード ベースを確認すると、オブジェクト (特に文字列や XML ノード) が多すぎるか、メモリ リークが発生しているかがわかります。

定型的なコードは、創造的にリファクタリングすることで回避できます。繰り返しを避けるのは良いことです。すでにどの程度の構造を持っているかは不明ですが、少し作業するだけで、ボイラープレート JDBC 呼び出しを簡単に集中化できます。JDBC コードを繰り返す必要があるという根本的な理由はありません。どのコードが繰り返されているか教えていただけますか?

最後に、データベース上に Web 層を配置する正当な理由がたくさんあることを敢えて言います。柔軟性 (展開の)、互換性、制御 (SQL の)、およびセキュリティはすべて、Web 層を維持する十分な理由です。

于 2008-11-08T01:37:51.897 に答える
0

MySQL 5.0.3+ には、(選択権限を設定せずに) 設定できる実行権限があり、求める機能を得ることができます。

ただし、JDBC に関するこのmysql バグ レポートに注意してください(その他の多くのドライバーも同様です)。

JDBC で [procedure] を呼び出すと、「java.sql.SQLException: ドライバーは、引数の宣言に従うために '\nbegin' または '\n' を含むプロシージャーの宣言が必要です。または、解析するために mysql.proc に対する SELECT 特権が必要です。列の種類。」

回避策は次のとおりです。

JDBC に準拠していないややハックな回避策については、/J 5.0.3 の「noAccessToProcedureBodies」を参照してください。

于 2008-11-07T21:41:29.143 に答える
0

特にボイラープレートをあまり使わずにソリューションを実装できると確信しています。Spring のリモーティングのようなものを使用します。また、Tomcat はどのくらいのメモリを消費していますか? 率直に言って、あなたが説明していることを実行するだけであれば、128MB 未満で動作する可能性があると信じています (保守的な推測)。

あなたの代替案は、問題を解決する「本で正しい」方法です。プロトタイプを作成して、それがどのように機能するかを確認します。発生する可能性のある主な問題は次のとおりです。

  • この点に関して、MySQL にはいくつかの重要な落とし穴があります
  • MySQL のストアド プロシージャのサポートは原始的すぎて、多くの作業を行う必要があります
  • その他の奇妙なしゃっくり

私はおそらく MySQL 嫌いの 1 人なので、状況は私が思っているよりも良いかもしれません。

于 2008-11-07T21:44:06.237 に答える