並行性についての質問です。世界中の 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();
}
}