2009-08-05 27 views

答えて

17

我々は生産経験に基づいて採用するいくつかのプラクティス:

  • 検証接続接続プールからそれらを取り出します。
  • 接続が有効であることを前提としていないために、あなたのサービスコードを書く - これを怠ると、特に本番環境で
  • 可能な限りの悲しみのかなりの原因と明示的にクローズし、それらを使用した後の接続を配置することができます(using(conn){}ブロックがうまく動作)
  • サービスでは、可能な限り短時間で接続を使用する必要があります。特に、スケーラブルなソリューションを作成する場合は特に注意が必要です。
  • 要求の典型的な期間に適した要求に対して明示的なタイムアウトを使用することを検討してください。あなたが望む最後のものは、潜在的にあなたのシステム全体をブロックするためにハングする要求の1つのタイプを持つことです。
  • 可能であれば、データベースのハード解析を避けるためにバインド変数を使用してください(これは、このプラクティスから始めないとパフォーマンスの悪夢となります)。バインド変数を使用すると、基本的なSQLインジェクション攻撃から保護することもできます。
  • システムに適切な診断サポートが組み込まれていることを確認してください。Oracle ADOコールのラッパーを作成して、それらのすべてを計測し、記録し、検索することを検討してください。
  • 可能であれば、ストアドプロシージャまたはビューを使用して、クエリセマンティクスおよびデータモデルの知識をデータベースにプッシュすることを検討してください。これにより、プロファイリングとクエリチューニングが容易になります。
  • また、データアクセスをカプセル化するために、特に読取り操作と書込み操作の両方を実行する場合は、良いORMライブラリ(EF、Hibernateなど)を使用することを検討してください。
  • 上記を拡張して、個別に書かれた何十ものSQLフラグメントをコードに追加しないでください。これはすぐに保守性の悪夢になります。
  • データベースとしてOracleにコミットしている場合は、Oracle固有の機能を使用することを心配しないでください。 ODPライブラリは、テーブル・カーソルやバッチ操作などのほとんどの機能へのアクセスを提供します。
  • Oracleは、空の文字列( "")とNULLを同等に扱います。 Oracleに適した文字列処理を標準化します。
  • データベースにUnicode .NET文字列を直接格納する場合は、VARCHAR2ではなくNVARCHAR2を使用することを検討してください。それ以外の場合は、すべてのユニコード文字列をコアのASCIIサブセットに一致するように変換します。そうしないと、あらゆる種類の混乱して悪いデータ破損の問題が引き起こされる可能性があります。
+0

これは非常に役に立ちます。他の人もこれに貢献できるように、質問を開いたままにします。 – Vivek

+0

@LBushkin - 接続を十分に閉じていないのですか?なぜ私は処分すべきですか? –

+0

一般的に、型がIDisposableを実装している場合は、終了時にDispose()を呼び出すことをお勧めします。これは親しみやすいことです。そのため、基になるコードが最適化(リソースの早期リリースなど)そうする機会があります。データベース接続の特定のケースでは、いくつかのライブラリは接続廃棄に応じて内部的に最適化を行います。これは、ほとんどの場合接続が実際にプールされるため、アプリケーションとデータベースの両方にとって良いことです。接続を閉じるだけで、基礎となるプロバイダに完了したことを知らせるだけでは必ずしも十分ではありません。 – LBushkin

3

のOracleプロバイダは、ASP.NETアプリケーションで正常に動作しますが、注意してください。あなたのアプリケーションプールを使用してOracleクライアント32ビットまたは64ビットの正しいバージョンをマッチング

  • 32ビットアプリケーションプール用の32ビットクライアント、64ビットアプリケーションプール用の64ビットクライアント。
  • 権限 - Oracleクライアントのディレクトリにアプリケーションプールのユーザー権限付与(C:10.2.0 \ client_1 \ \オラクル\製品は)

これはASPとは何の関係もありません。NETであるが、Oracleは空の文字列とnullの両方をnullとして格納することに注意することが重要です。したがって、何かが空でnullでないことを知る必要がある場合、その列を追跡するために列を追加する必要があります。

4

いくつかのより多くのヒント:あなたは、Oracleの使用Oracle固有の機能にコミットし、あなたのコードにOracle.DataAccessアセンブリをリンクしている場合、マイクロソフトのOracleプロバイダを使用して

+0

また、Microsoft .NETプロバイダ(.NETフレームワークと一緒に提供される)には、大きな値をStoredProceduresに解析する際に問題があります。大きなアイテム(私が信じる32000バイトより大きい)は、タイプの不一致に関するエラーを引き起こします。これは、blobと長いテキスト(長いテキストを格納する)を扱うときに大きな問題を引き起こす可能性があります。ただし、パラメータ化されたクエリは大きなアイテムを受け取ることができます(現在、私のプロジェクトの1つは、この問題を回避するためにハックを使用しています)。 – Gertjan

+0

ストアドプロシージャ内の文字列の最大長は、32k文字(またはバイト)です。大きい方はすべてLOB型(BLOB、CLOBまたはNCLOB)である必要があります。 LOBのサイズは2GBを超えることができます。 – Christian13467

関連する問題