繁体   English   中英

有关Servlet应用程序中的连接池的一些问题

[英]Some questions about connection pooling in a servlet application

我是Web应用程序设计中Java的新手 ,但我感到惊讶的是我现在没有多少东西。
特别是在理解servlet容器如何管理资源(如连接池类)时遇到问题。

假设我选择了一个池库(比方说c3p0),我读到有很多使用和管理连接池类的方法。

例如,在许多示例中,我看到某个类(例如ComboPooledDataSource)在servlet的init()方法中实例化,在这里我有点困惑。 我的意思是,我认为一个连接池系统必须存在,并且对于需要连接的所有servlet都有单独的生命,否则就没有意义。 因此,我认为下面的类可能是一个线程,该线程从调用init方法的第一个servlet启动一次,然后一直存在,直到有人不中断它为止。 那是对的吗? 如果没有,它如何运作?

无论如何,一旦启动此类,它是否在上下文中的所有servlet之间共享(我的意思是在init方法中调用它的所有servlet)?

其他示例将连接池系统设置为资源,例如在context.xml中定义它,然后任何需要连接的servlet都必须通过JNDI访问它(JNDI是正确的吗?)。 我了解(或我认为)的是,在这种情况下,将在应用程序启动时启动执行池系统的线程,并且每个Servlet都可以在需要时访问它。 那是对的吗?

在这种情况下,我可以通过servlet或后台线程运行时来修改连接池系统属性吗? (例如,如果我想根据请求数的统计信息来更改连接数等)

如果我想创建不同的池(例如,我想将数据库访问权限细分为N个不同的数据库,或者我想使用不同的用户名进行访问),是否需要创建与我想要的其他类型的连接一样多的资源?

这两者之间是否存在“更好”的方式,或者它们是等效的?

它归结为易于使用的Web应用程序和(Tomcat)服务器维护。
您描述了2个用例:

  1. 一个webapp使用的连接池
  2. Webapp之间共享的连接池

第一种情况适合于“易用性”:您可以将war文件放在任何Tomcat服务器中,并且由于web应用程序包含访问数据库所需的所有代码,因此它可以工作(例如Jenkins提供了这样的war文件)。 无需更改Tomcat服务器的配置并重新启动它。
如果可以的话,我喜欢提供这类war文件,因为出错的地方更少了(例如,与其他Web应用程序的配置没有冲突)。 您可以通过提供嵌入有应用程序的Tomcat来进一步采取措施(因此,您不需要Tomcat服务器作为开始, 此处为示例项目)。

请注意,打开数据库连接池(最好通过ServletContextListener.contextInitialized而不是servlet)并关闭它(通过contextDestroyed )并不涉及启动和停止线程。 池实现可以决定启动后台线程(例如,删除空闲和/或放弃的连接),但是不必这样做。

第二种情况适用于具有共同点的几个Web应用程序。 例如,如果所有都在同一个Tomcat服务器上运行的多个Web应用程序都使用相同的数据库,如果Tomcat服务器已经具有可用于不同Web应用程序的连接池(通过JNDI),则可以节省时间和精力。 Tomcat服务器可以在“ lib”目录中包含JDBC驱动程序软件和连接池软件,并且只需在服务器的context.xml中进行一次配置即可。 如果数据库更改或需要不同的(已修补的)软件组件,则仅需要更新tomcat服务器,并且所有Web应用程序都可以保持不变。 在这种情况下,更新Tomcat服务器而不是每个Web应用程序要容易得多。

第二种情况也更适合监视:您很有可能可以通过JMX监视连接池。 这种监视可能在第一种情况下不可用。

连接池不需要更改“根据请求数统计信息来确定连接数”:您可以设置要使用的最大连接数,并可以设置超时来删除空闲连接。 然后,连接池将随着请求数量的增长和收缩。

将数据库访问权限细分为N个不同的数据库,每个数据库将需要一个不同的连接池,除非这是“只读”的,在这种情况下,您还可以使用负载平衡器。

使用不同的用户名进行访问有些棘手。 我读了另一个问题(抱歉,我现在找不到了),您可以在运行时更改架构,但是更改用户名/密码可能需要新的连接,在这种情况下,连接池将消失。

您是否正在使用Tomcat运行servlet? Tomcat 7具有您可以研究的新池化解决方案。 Tomcat还包括dbcp库,您可以通过设置factory =“ org.apache.tomcat.dbcp.dbcp.BasicDataSourceFactory”来使用它们。 DBCP池是自我管理的,您可以在context.xml文件中定义配置值,我不知道如何动态更改这些值。 我相信Tomcat 7池使用与DBCP相同的配置,并带有几个添加的选项,以使两者之间的转换变得简单。 我们在所有应用程序中都使用DBCP,并且没有遇到问题,因此我没有使用Tomcat 7池。 我认为您需要创建许多池来处理大多数需求。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM