2016-12-21 4 views
1

私はFirebirdのデータベースJava JDBCとFirebirdのデータベース接続が切断されるのはなぜですか?

public static Connection dbStatic;  
    ... 
    public void getConnection(){ 
    FBWrappingDataSource DataSource = new FBWrappingDataSource(); 
    DataSource.setDatabase("localhost/3050:C:/MyDatabase.FDB"); 
    DataSource.setDescription("TNS Development Database"); 
    DataSource.setType("TYPE4"); 
    DataSource.setEncoding("ISO8859_1"); 
    DataSource.setLoginTimeout(10); 
    try { 
    dbStatic = DataSource.getConnection("UserName", "Password"); 
    } catch (SQLException e) { 
    e.printStackTrace(); 
    } 
} 

に接続するために、次のコードを使用して...と切り離すために、次の午前:

... 
dbStatic.close(); 
... 

私は、Windows 7から32ビットにruningてのFirebird 2.1を使用していますマシンは、1.7、Jaybirdバージョン2.2.8、Win7-32​​bit上で実行されているTomcatのバージョン7.xxからverstionジャワで、ブラウザは(新しめ)何かまたは他のWin XP SP3を実行しているChromeのバージョンです。

私は接続の数を見てIBExpertと呼ばれるサードパーティ製のツールを使用し、および/または私はこの文を実行します。

select * from mon$attachments; 

私は(.close後にデータベースへの接続数を見てみると)ステートメントを実行すると、数値は減少しません。何故ですか?十分に長く待つか、Tomcatサーバーを再起動すると、接続数が減少します。ブラウザを閉じても接続には影響しません。

+1

[ 'FBWrappingDataSource']のJavadocの最初の行(http://www.firebirdsql.org/file/documentation/drivers_documentation/java/2.2.2/docs/org/firebirdsql/pool/FBWrappingDataSource.html )**接続プール**を含むDataSourceの実装** – Andreas

+0

あなたは 'DataSource'を破壊していないようです... –

+0

@ Arioch'Theファイナライザが呼び出されると、最終的に破棄されます。 OPが予期せずに接続が切断されることで時折問題が発生しないならば、私は驚くだろう。これは、比較的短命のアプリケーションでなければなりません(または、JVMがファイナライザを呼び出すときに接続が使用されなくなります)。 –

答えて

3

アンドレアスは、すでにコメントで指摘したように、FBWrappingDataSourceは、接続プールです。これは、プールが物理的な接続を開いたままにし、接続プール内の物理的接続によってバックアップされた論理接続を引き渡すことを意味します。その論理接続でclose()を呼び出すと、物理接続は再利用可能なプールに戻されます。物理的な接続は開いたままです。

あなたはすべての接続をクローズする場合は、FBWrappingDataSource.shutdown()を呼び出す必要があります。これにより、現在使用されていない物理接続(!)がすべて閉じられ、データソースがシャットダウンとしてマークされます。

しかし、パッケージorg.firebirdsql.poolですべてが非推奨と考えるべきです。それは(Jaybird 3であなたの代わりにorg.firebirdsql.ds.FBSimpleDataSourceを使用する必要があります)あなただけのデータソースを使用する場合は、org.firebirdsql.pool.FBSimpleDataSourceを使用Important changes to Datasources

を参照してくださいJaybird 3で削除されます。

あなたは、接続プーリングを使用する場合は、HikariCP、DBCPまたはC3P0のようなサードパーティの接続プールのライブラリを使用しています。言っ

は、私はあなたが考慮すべきいくつかのことを指摘したい:

  • をJaybird 2.2.8は、2.2.12へのアップグレードを検討し、現在のlatest release of Jaybird最新バージョンではありません。接続のための静的フィールドを使用して
  • は、一般的に(特にWebアプリケーションとの)良いアイデアではないことが本当にあるならば、あなたが必要なもの、あなたのデザインを考えます。あなたは、データソースを静的フィールドにして、作業単位(つまり、1つの要求)の接続を取得(および閉じる)するほうがよいでしょう。また、DriverManagerを使用して接続を作成する方が簡単な場合もあります。
  • 命名規則:あなたは一般的なJavaの規則に従うならば、あなたの変数DataSourcedataSource呼ばれるべきintをとる一切方法Integer.parseIntがないよう
  • setLoginTimeout(Integer.parseInt(10))は、コンパイルエラーにつながるはず、と方法自体は、すでにintを受け入れます。
+0

このコードは私の生産コードではありません。 Firebirdとの接続が解除されていない理由を理解することができるかどうかを確認するために作成したオリジナルのペアバージョンです。プロダクションコードでは、データソースに静的変数を使用しません。プールの利点は何ですか? Firebirdに接続するための処理オーバーヘッドはありますか?平均して200〜400人の訪問者が1日にピーク時に使用するWebサイトを持っているとすれば、30人のユーザーが同時に接続プールを使用するのは当然でしょうか?私たちがこのWebコンポーネントを実装して以来、私たちのデータベースサーバーはかなり減速しています。 –

+1

@ JonathanElkins接続プーリングの利点は、接続が再利用されることです。新しい接続を作成して閉じる時間を節約します。また、正しく使用すると、使用する接続の数を減らすこともできます**。しかし、質問に表示されたコードが本番環境で使用するコードのようなものであれば、プーリング機能を利用することはできません。データベースの負荷が増え、さらに情報がなくてもわかりづらい場合は、アプリケーションが非効率なクエリ、N + 1クエリの問題などを行っているか、トランザクションを間違って使用している可能性があります。 –

関連する問題