关于servlet的线程安全性有很多问题,但我想问一下servlet使用的其他类。
在正常的应用程序中,servlet类也使用其他普通类(我的appl也是这样),就像MVC中的那样。因此,我的问题是,是否应该将模型类中的所有函数声明为同步

假设我有2个servlet和使用类Dog和Cat。这两个类都有一些静态和非静态函数以及静态和非静态变量。
这些方法使用数据库连接来显示内容,我为这段代码获得了nullpointerexception。
try {
Connection con = DriverManager.getConnection(url, user, pass);
Statement stmt = con.createStatement();
select = "SELECT * FROM table";
java.sql.ResultSet result = stmt.executeQuery(select);
while(result.next())
{
do something
}
}
catch (SQLException e) {
e.printStackTrace();
}
finally {
if (con != null)
try {
con.close();
}
catch (Exception e) {
e.printStackTrace();
}
}令我惊讶的是,我在行try { con.close(); } : nullPointerException中得到了我理解的异常,因为我已经检查了if (con != null),所以con不应该是null。
所以,
发布于 2014-08-07 07:39:16
在servlet中,它通常是糟糕的设计..。可能是个错误..。有静态变量。但是,如果您确实使用(并且需要使用)静态变量,那么访问和更新它们的代码将需要正确地同步。(Servlet代码在多个线程上执行.除非您只通过配置一个工作线程来阻塞web容器框架。)
如果正确地将方法声明为synchronized是实现此目的的一种方法。
但是..。
简单地将方法声明为synchronized willy-nilly是个坏主意。在开始添加同步之前,您需要了解代码的预期并发模式。盲目地添加synchronized会导致并发瓶颈和潜在的死锁。(而且你仍然有线程安全问题.如果互斥的粒度不适合这个问题。)
我同意罗曼C的回答。您不应该试图跨多个请求共享相同的数据库连接.如果这就是你真正要做的。我建议您考虑使用数据库连接池。
发布于 2014-08-07 07:40:25
不要在其他类中使用静态。那么您就不应该害怕线程安全了,JDBC会注意它。但是,如果您在servlet之间共享一些对象,比如在某个上下文中,那么您应该同步获得对它的访问的容器。这就是使用一些基于servlet技术的框架的原因,这些框架是为了帮助您更好地使用其他对象并以线程安全的方式使用它们而创建的。原始servlet是强大的,但是您必须解决问题,您需要进一步解决遇到的问题,尝试重新发明轮子。
关于异常捕获,它可能会在第一个语句中抛出,因此con对象仍然没有初始化。手动管理连接(如果有的话)并不是一种好方法,因为您仍然需要解决相同的问题来同步它们。作为JDBC的一个标准,您可以通过池提供API来管理连接,这样您就不会重新发明轮子来提供您自己的同步方法。
https://stackoverflow.com/questions/25176514
复制相似问题