2017-02-13 16 views
-1

JavaのREST Webサービスがジャージーで構築されているため、セキュリティ上の理由からOS環境変数にメソッドのパラメータ:DriverManager.getConnection();を保存します。 URL、ユーザー名、およびパスワード。JavaでSystem.getenv()を使用した場合のパフォーマンスへの影響

すべてのリクエストが自分の接続を作成する必要があるので、System.getenv("key");への呼び出しがパフォーマンス上の問題であるかどうかを知りたいですか?

そうすることのアイデアは、この記事からです:私は右、一度変数をロード

public class EnvironmentHelper { 
    static final String URL; 
    static final String USERNAME; 
    static final String PASSWORD; 

    static { 
     URL = System.getenv("URL"); 
     USERNAME = System.getenv("USERNAME"); 
     PASSWORD = System.getenv("PASSWORD"); 
    } 
} 

この方法:http://docs.aws.amazon.com/elasticbeanstalk/latest/dg/java-rds.html#java-rds-javase

はこのような何かを持っている良いオプションでしょうか?どんなに多くのリクエストを受けても問題ありません。

+3

それぞれの 'System.getenv'は、ハッシュルックアップと同じくらい時間がかかります。パフォーマンスへの影響はゼロでなければなりません。あなたが関心を持っているならば、自分でそれをプロファイルする必要があります。 – ajb

+4

接続を開く際のオーバーヘッドと比較して、何もせずに 'getenv()'はまったく重要ではありません:*しかし*このテクニックは通常のテクニックより安全です。攻撃者があなたの 'context.xml'ファイルにアクセスできるなら、彼はこれにアクセスできます。 – EJP

+0

@EJPはい、そうです。毎回接続を開いたときの影響を最小限にする唯一の解決策は、接続プールを使用することです。 – Luiz

答えて

1

System.getEnv(name)実際にはHashMapへの参照ですProcessEnvironment.getEnvにtransaltes(ProcessEnvironmentは、HashMapのの拡張である)このHashMapのは、クラスのinitilaization上で動作する静的ブロックにロードされている - ので、この は非常に高速検索がOであるようになりそうです(1)の確率が高い。

1

getenvを呼び出すと、リクエストごとに新しい接続を作成する場合と比較してパフォーマンス上の問題が発生する可能性があるのではないかと疑いますが、上記の静的な読み込み方法を使用して問題に近づけば最適です。これにより、新しい接続ごとに環境リストを検索する作業が不要になります。

operating system manual for the getenv functionによれば、値を見つけるために環境リストを検索する必要がありますが、私の知識からは、環境変数がプログラムにコピーされるので、syscallsが必要ないことがわかります。

+0

スレッドセーフなので、すべての呼び出しはmutexをロックする必要があります。 – Luiz

+0

@Luizいいえ、スレッドセーフではありません: 'getenv()の実装は再入可能である必要はありません'。 – EJP

関連する問題