2016-05-24 11 views
-1

サーブレット・インスタンスが一度作成され、サーブレットに対する複数のユーザー・リクエストに基づいて、コンテナは各ユーザー・リクエストを処理するスレッドを作成します。サーブレットでoracleストアド・プロシージャを呼び出す

マルチスレッドのサーブレットにプロシージャを格納している場合はどうなりますか?ストアード・プロシージャーは、ユーザー要求からパラメーターを取り出し、そのユーザーだけの出力を生成します。

複数のユーザーから同時にリクエストがあった場合はどうなりますか? user1によって生成されたプロシージャ結果は、各スレッドが独自の実行フローを持つため、別のユーザー要求によって上書きされますか?理解するのを助けてください。

私は、私が試している単純な例を終わりから終わりまで与えました。あなたは、関数の最後で閉じられている同じ接続を使用しているので、ここで私は、並列実行の場合には、あなたが非常に高い内部のいくつかのSQLExceptionを取得します(finallyブロック)同期

public class Demo { 
    public static void main(String[] args) { 
     DBThread db = new DBThread(); 

//Only one instance and multiple threads 
     Thread request1= new Thread(db, "request1"); 
     Thread request2= new Thread(db, "request2"); 
     request1.start(); 

     request2.start(); 
} 
} 


DBThread.java 


import java.sql.CallableStatement; 
import java.sql.Connection; 
import java.sql.DriverManager; 
import java.sql.ResultSet; 
import java.sql.SQLException; 
import java.sql.Statement; 


public class DBThread implements Runnable { 


    public void getData(){ 
     Connection con=null; 
     Statement statement = null; 
     CallableStatement callProcedure = null; 
     ResultSet rs = null; 
     try { 

       con = getDBConnection(); 
      if(con==null) 
      System.out.println("Unable to get connection for " + Thread.currentThread().getName()); 
      else 
      { 

         callProcedure = con.prepareCall("{call PROCEDURE1(?)}"); 
        callProcedure.setString(1,Thread.currentThread().getName()); 
        callProcedure.execute(); 
        statement = con.createStatement(); 
         rs = statement.executeQuery("select id,inputname from temp1"); 

         while(rs.next()){ 

         System.out.println("Thread "+Thread.currentThread().getName() +":"+ rs.getString(1) +":" + rs.getString(2)); 

         } 


       } 



     } catch (SQLException e) { 

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

      e.printStackTrace(); 
     } 
      finally{ 
       try{ 
        if(callProcedure!=null){ 
         callProcedure.close(); 
        } 
        if(rs!=null) 
         rs.close(); 

        if(con!=null){ 
         con.close(); 

         System.out.println("Connection close for " + Thread.currentThread().getName()); 
        } 

       }catch(Exception e){ 
        System.out.println("print therea" + Thread.currentThread().getName()); 
       } 
      } 


    } 



    public void run() { 
     this.getData(); 

    } 


     public Connection getDBConnection() throws SQLException, Exception{ 
      String user = null; 
      String pwd = null; 
      String dbURL = null; 
      String driverClassName = null; 
      Connection con = null; 

       if(con == null || con.isClosed() == true){ 

        user = "readonly"; 
        pwd = "XXXX" 
        dbURL = "jdbc:oracle:thin:@host:port:SID; 
        driverClassName = "oracle.jdbc.driver.OracleDriver"; 

        Class.forName(driverClassName); 
        con = DriverManager.getConnection(dbURL, user, pwd); 

       } 
       System.out.println("Connection got for " + Thread.currentThread().getName()+ "Connection "+ con); 
      return con; 
     } 
} 




Oracle procedure : 

create or replace 
PROCEDURE PROCEDURE1(id varchar2) AS 
BEGIN 
DELETE from temp1; 
    FOR i IN 1..5 LOOP 
      INSERT INTO temp1 VALUES (i,id); 
     END LOOP; 
    COMMIT; 

END PROCEDURE1; 
+0

与えられた例はサーブレットのタイプではありません。しかし、単純なスレッドです – Vani

+0

テキストをラップするので、最初の段落を再フォーマットしてください。たぶんあなたは**大胆**をしたいですか? – Neapolitan

答えて

0

を使用していませんでした最初のスレッドが完了した後の2番目のスレッド。

関連する問題