2016-01-03 5 views
5

TomcatのJDBCデータソースから接続を取得する簡単なwebappがあります。接続の使用状況を追跡するために、接続のオープンとクローズ中にロギングを実装する予定です。ロギングはこのようなものを印刷することになっていました。オブジェクトを一意に指定する方法

20151230143623.947[Thread-3] INFO [DataSourceManager:19] Opened connection identified by id : BlahBlahBlah1 
20151230143623.947[Thread-3] INFO [DataSourceManager:19] Closed connection identified by id : BlahBlahBlah1 

オープンとクローズの方法は次のとおりです。

Connection openConnection(String JNDILookupName) throws Exception { 
    Connection connection = DataSourceManager.getConnection(JNDILookupName); 
    logDBOperation("Opened", connection.toString()); 
    return connection; 
} 
Connection closeConnection(String JNDILookupName) throws Exception { 
    connection.close(); 
    logDBOperation("Closed", connection.toString()); 
} 
void logDBOperation(String operation, String connecitonName){ 
    logger.info(operation+" connection identified by id : "+connectionName); 
} 

ここで私は、ログに接続の一意の名前としてconnection.toString()を使用しています。しかし、私はこれを行うためのより良い方法があるかどうかを知りたい。

+1

印刷しようとしているオブジェクトはありますか?印刷しようとしているクラスが 'toString()'をオーバーライドしていないようです。 –

+0

オブジェクトを印刷しようとしていません。私は、開いているか閉じているConnectionオブジェクト**の名前を表示したいだけです。 –

+0

あなたはコードを投稿します。 –

答えて

2

ObjectスーパークラスのデフォルトのtoString()実装をそのまま使用してください。

それはすでにあなたのためにこれを行います。

getClass().getName() + '@' + Integer.toHexString(hashCode()) 

toHexString(hashCode())がすぐそこにあなたに一意のIDを提供します。そして、これはJVMによって保証され、ユニークな価値になります。

+0

私もこのaproachを計画していましたが、この文書を読むとhttp://eclipsesource.com/blogs/2012/09/04/the-3-things-you-should-know -about-hashcode /このソースごとにhashCodeはすべてのオブジェクトに対して一意でなければなりません。それが私が他の選択肢を見なければならなかったところです。 –

+0

@RajaAnbazhagan同じ時刻に開いている2つの接続の2つの 'hashCode()'の可能性は、0の次にあります。船外に出て100%ユニークにしたい場合は、 'hashCode()+ ' - ' + System.nanoTime()'のようなことをします。エンタープライズ規模のjdbcでログをデバッグするときに、一意のIDとして 'hashCode()'を使用することができました。 –

+0

最後に、hashcodeアプローチのhexStringを使うことに決めました。 –

関連する問題