我有两个问题:
Q1。关于" servlet对象的生命周期" ?我们知道每次访问都会创建请求和响应对象,但每次访问都不会创建Servlet对象。不同的请求具有不同的线程,而不是实例,因此它可能消耗更少的资源。那么如何同时提供多个reuest?我得到了这个当你从DB读书时不会出现问题,但是当谈到写作时会产生问题吗?亚马逊或任何在线预订服务等大公司如何处理[来自servlet方面]?
Q2。当我们制作一个spring mvc web-app [使用默认配置]时,会创建多少个控制器类对象;我认为ans是1,因为组件扫描只发生一次!! ...但是它再次让我回到上一个问题,多个请求如何使用单个对象而不会干扰?...
一个简单的例子可能会让我的问题清楚: 假设我有这样的控制器类:
class controller{
void add(a,b){ blah blah...}
void sub(a,b){ blah blah...}
void multiply(a,b){blah blah...}
};
现在如果有3个线程t1,t2和t3想要使用控制器的单个对象同时访问add,sub和multip !!它们将如何同时进行?
不同步意味着线程必须等待轮到他们。我的意思是说,直到具有该对象的线程完成,其他线程将等待。所以他们不会同时工作但是等待。大公司如何管理这种同步行动
答案 0 :(得分:1)
servlet就像Spring MVC控制器一样,是单例。因此,使用唯一实例同时为多个请求提供服务。
这应该不是问题,因为servlet或Spring MVC控制器是无状态对象:它们接受输入并产生输出,而不修改任何内存状态。如果是这样,则必须正确同步对此内存中状态的访问。
关于对数据库的访问,这通常由数据库本身处理。关系数据库提供ACID保证,允许使用事务同时访问数据库。例如,如果以相反的顺序写两行,则可能会出现死锁,但数据库会检测到该死锁,并且其中一个线程将获得异常,并且其事务将被回滚,使数据库保持一致状态。
其他数据库使用更悲观的锁,允许一次只访问一个线程到他们的集合。