gpt4 book ai didi

multithreading - servlet/jdbc的正确设计和并发问题

转载 作者:行者123 更新时间:2023-12-03 13:12:46 26 4
gpt4 key购买 nike

我有几个关于正确设计和并发性的问题想问。例如,我创建了一个简单的应用程序,它通过 servlet 获取参数并添加到数据库。所以过程是这样的。
1) 将名字/姓氏发送到 servlet
2) Servlet 调用 PersonDao.createPerson(firstname, lastname)。

涉及的类(class)...
PersonDao(接口(interface))
PersonDaoImpl(具体类)
AbstractDao(抽象类)
个人 Controller (Servlet)

如果这是一个正确设计的连接池代码,我想知道您的所有意见。数据源的静态创建是否正确?您会更改 AbstractDao 类中可能引起并发问题的任何内容吗?

public interface PersonDao {
public void createPerson(String firstname, String lastname);
}

_
public class PersonDaoImpl extends AbstractDao implements PersonDao {

@Override
public void createPerson(String firstname, String lastname) {

String query = " insert into persons values (?,?) ";

Connection connection = null;
PreparedStatement ps = null;
try {
connection = getConnection();
ps = connection.prepareStatement(query);
ps.setString(1, firstname);
ps.setString(2, lastname);
ps.executeUpdate();

} catch (SQLException e) {
System.out.println(e.toString());
} finally {
close(connection, ps, null);
}

}
}

_
public abstract class AbstractDao {

protected 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");
}
}

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

protected void close(Connection connection) {
close(connection, null, null);
}

protected void close(Connection connection, Statement ps) {
close(connection, ps, null);
}

protected void close(Connection connection, Statement ps, ResultSet rs) {

try {
if (rs != null)
rs.close();

if (ps != null)
ps.close();

if (connection != null)
connection.close();

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

}

}

-
@WebServlet("/PersonController")
public class PersonController extends HttpServlet {
private static final long serialVersionUID = 1L;

public PersonController() {
super();
}

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
}

protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String firstname = request.getParameter("firstname");
String lastname = request.getParameter("lastname");

PersonDao personDao = new PersonDaoImpl();
personDao.createPerson(firstname, lastname);

}

}

我的另一个问题是这里是否存在并发问题,特别是在 servlet 中。想象一下 1000 个请求同时命中 servlet。让我担心的是 PersonDaoImpl。
1000 个不同的线程,每个线程都有自己的堆栈。所以有 1000 个不同的 PersonDaoImpl 实例。如果我们使用 AbstractDao,它会在数据源上调用 getConnection。

所以问题会是......
getConnection() 是否会造成并发问题?
1000 个不同的请求是否会对上述代码中的数据源对象构成威胁?
如果有一个私有(private)的 PersonDao personDao = new PersonDaoImpl() 作为 servlet 中的实例怎么办。现在会发生什么?

我真正感到困惑的是当 PersonDaoImpl 被实例化时 doGet 内部发生了什么。有人可以给我一个演练吗。我的问题的要点是我那里的代码是否是线程安全的。

最佳答案

具有讽刺意味的是,我刚刚回答了 10 月份的一个问题,就像这样。

See my answer here.

关于multithreading - servlet/jdbc的正确设计和并发问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20987939/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com