0

並行性についての質問です。世界中の 10 人の異なるユーザーからの 10 の異なる doGet() リクエストが、互いに数ミリ秒以内に LoginServlet.java というサーブレットに対して呼び出されたとします。サーブレットの doGet() メソッド内には、DbUtil.getConnection() への呼び出しがあります。DBUtil クラスは静的であり、メソッド getConnection() も静的です。そこで何が起こるの?考えられる競合状態、同時発生の問題などは何ですか? 接続などの間に破損がある可能性はありますか? 接続プーリングのためのこの設計に代わるより良い方法はありますか?

LoginServlet.java がこのようなことをしているのを想像してみてください。

@WebServlet("/LoginServlet.secure")  
public class LoginServletextends HttpServlet {  
    private static final long serialVersionUID = 1L;  

    public LoginServlet() {  
        super();  
    }  

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {  
        Connection connection = DbUtil.getConnection();  
    }  

これは、接続を取得するための静的 DBUtil クラスです。

package util;    

import java.sql.Connection;    
import java.sql.SQLException;    

import javax.naming.InitialContext;    
import javax.naming.NamingException;    
import javax.sql.DataSource;    

public class DbUtil {    

    private static DataSource dataSource;    

    static {    
        try {    
            dataSource = (DataSource) new InitialContext().lookup("java:comp/env/jdbc/MyDataSource");    
        } catch (NamingException e) {     
            throw new ExceptionInInitializerError("'jdbc/MyDataSource' not found in JNDI");    
        }    
    }    

    public static Connection getConnection() throws SQLException {    
        return dataSource.getConnection();    
    }    

}   
4

1 に答える 1

0

私は実際にあなたがここに持っているものとかなり似たものを実装しています。これが私がそれを実装した方法です: 私の答えはこちら

ロガーは本質的にスレッドセーフな設計ではないため、ロガーのインスタンス化を doGet 内に移動するなど、設計には BalusC からのこの回答に基づいて変更する必要がある要素がいくつかあります。ただし、私の DBEngine は同時実行をサポートするように設計されており、PostgresQL の自然な行レベル ロックを多用しています。

悲しいことに、私はまだこのプロジェクトを完全に完了していないため、どの落とし穴を避けるべきかを正確に判断することはできませんが、数か月以内にこの回答を拡大することができます. しかし、これにより、このトピックに関する私の研究の総体を知ることができます.

于 2014-04-12T17:16:20.367 に答える