我有一个运行 webapp 的 tomcat 服务器。在 webapp 的启动中,我使用实现的类为interface ServletContextListener
. 我在这里初始化的参数是在不同机器上运行的数据库的几个连接对象。
我的疑问是,我在这里创建的连接对象是每个实例一个(因为 tomcat 为每个客户端请求创建一个实例),还是整个 webapp 本身一个?
如果每个 webapp 一个,那么服务器是否可以处理大量的并发请求(每秒数千个请求)以对数据库执行 CRUD 操作?
我有一个运行 webapp 的 tomcat 服务器。在 webapp 的启动中,我使用实现的类为interface ServletContextListener
. 我在这里初始化的参数是在不同机器上运行的数据库的几个连接对象。
我的疑问是,我在这里创建的连接对象是每个实例一个(因为 tomcat 为每个客户端请求创建一个实例),还是整个 webapp 本身一个?
如果每个 webapp 一个,那么服务器是否可以处理大量的并发请求(每秒数千个请求)以对数据库执行 CRUD 操作?
ServletContext
每个 webApp 创建一个。服务器从 Web 应用程序读取 web.xml 文件,并ServletContext
根据您在 web.xml 上提供的配置创建一个。一旦创建,它就会在 Web 应用程序的组件之间共享。如果您的服务器上安装了多个 web 应用程序,您将有多个ServletContext
- 每个用于 web 应用程序。
供参考,请看这里
一个 webapp 只有一个 ServletContext 实例,并且 ServletContext 中的属性是应用程序范围的。
关于您的数据库连接,最好使用连接池(DataSource)而不是在 ServletContext 中添加 Connection 对象作为属性。
不确定您是不是这个意思,但请求是由 Servlet 而不是 ServletContext 处理的。
如果您在该属性上设置一个属性,则ServletContext
该属性的范围将适用于整个应用程序。
来自Java EE 7 规范:
ServletContext 接口的一个实例对象与部署到容器中的每个 Web 应用程序相关联。
无论发出多少请求,都只加载一个 ServletContext。
这甚至是 servlet 优于 CGI 的优势。
希望能帮助到你。