2016-05-24 90 views
-1

我們知道servlet實例只創建一次,並且基於多個用戶對servlet的請求,容器創建線程來解決每個用戶請求。在servlet中調用oracle存儲過程

如果我在多線程的servlet中存儲了過程,該怎麼辦?存儲過程從用戶請求中獲取參數,並單獨爲該用戶生成輸出。

如果我有多個用戶同時請求,該怎麼辦?用戶1生成的過程結果是否會被另一個用戶請求覆蓋,因爲每個線程都有自己的執行流程。請幫助理解。

我已經給出了一個簡單的例子,我試圖端到端。在這裏,因爲你使用的是在功能(finally塊)結束時關閉相同的連接,然後在並行執行的情況下,你很可能會得到裏面的一些的SQLException我沒有使用同步

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

示例給出的不是類型的servlet ..但是是簡單的線程 – Vani

+0

重新格式化第一段所以文本換行。也許你想要**大膽的**? – Neapolitan

回答

0

第一個完成後的第二個線程。