2014-02-19 47 views
1

我是新的Java在Web应用程序设计中,我惊讶有多少事情我现在不知道。
特别是我在理解servlet容器如何管理连接池类等资源时遇到了问题。有关连接池在servlet应用程序中的一些问题

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

例如在很多例子中,我看到某个类(比方说ComboPooledDataSource)在servlet的init()方法中实例化,在这里我有点混乱。我的意思是,我认为连接池系统必须存在,并且对于需要连接的所有servlet具有单独的生命,否则它是没有意义的。所以我认为下面的类可能是一个线程,它从第一个调用init方法的servlet开始,然后它继续存在,直到有人不打断它。那是对的吗?如果不是它如何工作?

无论如何,一旦我开始这个类,它是否在上下文中的所有servlet之间共享(我指的是在init方法中调用它的所有servlet)?

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

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

如果我想创建不同的池(例如,我想将数据库访问细分为N不同的数据库,或者我想使用不同的用户名访问)是否需要创建尽可能多的资源,以及我想要的不同类型的连接?

这两者之间是否有“更好”的方式,或者它们是否相同?

+1

我认为你对[对象池](http://en.wikipedia.org/wiki/Object_pool_pattern)的目的有点困惑,连接池通常不会有*线程*。 –

+0

是的我是,那是因为我在问问题 – LJSilver

+0

始终使用内置于您正在使用的应用程序服务器中的连接池。 –

回答

2

你使用Tomcat来运行你的servlets吗? Tomcat 7有一个可以调查的新的池化解决方案。 Tomcat还包括可以通过设置factory =“org.apache.tomcat.dbcp.dbcp.BasicDataSourceFactory”来使用它们的dbcp库。 DBCP池是自我管理的,您可以在context.xml文件中定义配置值。我不知道如何在运行中更改这些值。我相信Tomcat 7池使用与DBCP相同的配置,并增加了两个选项来使两者之间的转换变得简单。我们在所有的应用程序中使用DBCP,并没有遇到问题,所以我没有使用Tomcat 7池。我认为你需要创建很多池来处理你的大部分需求。

+0

是的,我是。我听说过这是最可能的解决方案,但我想知道这是如何工作的。 谢谢 – LJSilver

+0

ps。我读了关于dbcp的坏消息。人们建议c3p0或tomcat解决方案 – LJSilver

+1

dbcp工作得很好,直到你可以证明它没有。不要只是接受你在网上阅读的内容,而是有太多的谎言在流传着。无论如何,我从来没有遇到任何问题。 – Gimby

3

归结为易于使用webapp和(Tomcat)服务器维护。
您介绍2用例:

  1. 通过一个web应用
  2. 的webapps

第一种情况是适合“易用性”之间共享一个连接池使用连接池:可以将war文件放在任何Tomcat服务器中,它将起作用(例如,Jenkins提供了这样的war文件),因为webapp包含访问数据库所需的所有代码。无需更改Tomcat服务器的配置并重新启动它。
如果可以的话,我喜欢提供这些类型的war文件,因为更少的东西可能会出错(例如,与其他webapps的配置没有冲突)。通过提供嵌入了应用程序的Tomcat,您可以更进一步(因此您不需要Tomcat服务器即可启动,示例项目为here)。

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

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

第二种情况也更适合监视:您很有可能通过JMX监视连接池。第一种情况可能无法提供这种监测。

连接池不需要更改“连接数量作为统计数据的请求数量的函数”:您设置要使用的最大连接数量和超时以删除空闲连接。连接池随后会随着请求的数量而增长和缩小。

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

使用不同的用户名访问有点棘手。我在另一个问题(我再也找不到了,对不起)中读到了另一个问题,即可以在运行时更改模式,但更改用户名/密码可能需要新的连接,在这种情况下,连接池不在了。