2012-04-01 17 views
0

後に閉鎖され、私は、context.xmlファイル内でこの方法をconfiguedしているのはなぜデータベース接続は、私はTomcatの6で接続プーリングを使用していますすべての操作

<Resource name="jdbc/myoracle" auth="Container" 
       type="javax.sql.DataSource" driverClassName="oracle.jdbc.OracleDriver" 
       url="jdbc:oracle:thin:@127.0.0.1:1521:ORCLE" 
       username="scott" password="tiger" maxActive="20" maxIdle="10" 
       maxWait="-1"/> 

そして、これは、データソースを使用して接続を取得するために私のファクトリクラスです。

public class ConnPoolFactory { 
    private static DataSource dataSource; 
    private static Connection connection; 

    private ConnPoolFactory() { 
    } 

    public static synchronized Connection getConnection() throws SQLException { 

     try { 

      if (connection == null) { 
       Context initContext = new InitialContext(); 
       Context envContext = (Context) initContext 
         .lookup("java:/comp/env"); 
       dataSource = (DataSource) envContext.lookup("jdbc/myoracle"); 
       connection = dataSource.getConnection(); 
      } else { 
       return connection; 
      } 

     } catch (NamingException e) { 
      e.printStackTrace(); 
     } 

     return connection; 

    } 
} 

そして最後にブロック内の私のサーブレットから

、私はそれをこのよう

try { 

connection = ConnPoolFactory.getConnection(); 
finally 

{ 

if(conn!=null) 
con.close(); 
} 
を閉じています3210

私のユーザーインターフェイスから、私はInsert、Update、Delete、Select - のような異なるコマンド(ボタンを押す)を与えることができます。

私が直面している問題は、アプリケーションが1つのコマンドに対してのみ実行されるということです。たとえば、[挿入]ボタンをクリックした場合、レコードを正常に挿入しています。接続が閉じられているというサーバーコンソールの例外が表示されます。

私はようやく私のサーブレット内のコードをブロックすることを削除した場合、アプリケーションは、コマンドの任意の数の

のために正常に動作誰もいただきましたことfinnalyブロックと間違って私に教えてもらえます?

+2

あなたはcloseを呼び出した後に接続が閉じられているのか疑問に思っていますか? – Mat

答えて

1

ConnectionConnPoolFactoryの変数は、静的ではなくメソッドローカルである必要があります。 nullをテストする変数はconnectionではなく、dataSourceです。ヌル以外の値を取得したら、dataSource.getConnection()を返します。呼び出し元は、終了したら接続を閉じる必要があります。

0

工場では、接続が閉じていることを認識せず、引き続き引き渡します。私はそれがあなたがそれを考えていたものと仮定しています。

サーブレットを使用した後に接続を元に戻すか、工場で毎回新しい接続を作成する必要があります。

編集:より明確になろう:

あなたのサーブレットのコードは、要求ごとに一度呼び出されます。それがサーブレットの機能です。あなたがリクエスト後に接続を閉じることは私には思われます。ファイン。ただし、接続ファクトリは作成した接続を静的に格納します。したがって、2番目の呼び出しでは、すでに閉じられている接続が渡されます(実際には、接続ではなく、1つの接続で接続されています)。

接続を閉じないと、別のNastierバグが発生する可能性があります。2つの要求が同時に発生した場合、サーブレットスレッド間で接続を共有します。実行するDB操作によっては動作しない場合もあります。

+0

私のコードでは間違ってanythig参照してください。私は私の声明に合っていると思います。 – Pawan

+0

ユニットテストでそれを試してください:Connection c = ConnPoolFactory.getConnection(); c.close(); c = ConnPoolFactory.getConnection(); //接続を使用する – ptyx