-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;
与えられた例はサーブレットのタイプではありません。しかし、単純なスレッドです – Vani
テキストをラップするので、最初の段落を再フォーマットしてください。たぶんあなたは**大胆**をしたいですか? – Neapolitan