连接池还是数据源?我应该把哪个放在JNDI中?

Posted

技术标签:

【中文标题】连接池还是数据源?我应该把哪个放在JNDI中?【英文标题】:Connection pool or data source? Which should I put in JNDI? 【发布时间】:2011-12-03 03:51:00 【问题描述】:

在 JNDI 级别还是在 webapp 级别连接池更有意义?例如,我可以简单地在 javax.sql.DataSource 创建:

<Context antiJARLocking="true">
  <Resource name="jdbc/myDataSource" 
    auth="Container"
    type="javax.sql.DataSource" 
    driverClassName="com.mysql.jdbc.Driver"
    url="jdbc:mysql://localhost/myDataSource" user="user" password="password" />
</Context>

然后在 Spring 中这样配置池:

<bean id="myDataSource" class="com.mchange.v2.c3p0.DataSources"
  factory-method="pooledDataSource">
  <constructor-arg>
    <jee:jndi-lookup jndi-name="java:comp/env/jdbc/myDataSource" />
  </constructor-arg>
</bean>

或者,我可以直接在 JNDI 本身中配置池:

<Resource name="jdbc/myDataSource" 
  auth="Container"
  factory="org.apache.naming.factory.BeanFactory"
  type="com.mchange.v2.c3p0.ComboPooledDataSource" 
  driverClassName="com.mysql.jdbc.Driver"
  jdbcUrl="jdbc:mysql://localhost/myDataSource" 
  user="user" password="password"
  minPoolSize="3" 
  maxPoolSize="15" 
  maxIdleTime="5000"
  idleConnectionTestPeriod="300" 
  acquireIncrement="3" />

今年春天离开:

<jee:jndi-lookup id="myDataSource" jndi-name="java:comp/env/jdbc/myDataSource" />

在这两种情况下,myDataSource spring bean 都是 c3p0 连接池数据源,但哪一个更好?我认为在 JNDI 中使用池是最有意义的,但缺点是您必须将 c3p0 库推送到 servlet 容器级别,如果它们当前使用不同的版本,这可能会导致与现有 servlet 发生冲突。但是,将其放入 JNDI 意味着您的应用程序根本不必担心池化。大家觉得呢?

【问题讨论】:

如果可以的话,按照你喜欢的方式去做。如果可能,最好确保将所有内容集中在一个地方。 【参考方案1】:

您不需要对从 JNDI 获得的数据源进行池化,因为它已经被池化了 :)

拥有容器管理器池与拥有容器管理器池之间的唯一区别。应用程序池是在第一种情况下,您可以使用标准接口(例如 JBoss 控制台)监控池上的工作负载。然后,应用程序服务器的管理员管理有关增加池大小的决定(如有必要)。他还可以将应用程序切换到另一个数据库服务器(例如,计划从 MySQL 迁移到 Oracle)。缺点是您需要花更多的精力来为您的单元测试设置 JNDI 测试数据源(请参阅here)。

在第二种情况下,是的,您必须将 DBCP 或 c3p0 以及 JDBC 驱动程序与您的应用程序一起打包。在这种情况下,收集 Tomcat 中运行的所有应用程序的所有池的统计信息并不容易。此外,不能同时为所有应用程序迁移到更新的 JDBC 驱动程序(MySQL 4 到 MySQL 5)。即使您使用.property 文件,连接属性也会连接到您的应用程序(因此更改需要重新组装和重新部署项目)。也许您不需要所有这些,因为您只有应用程序、一个数据库并且没有管理开销。

关于此主题的更多主题:

10 pools with 5 connections v.s. 1 pool with 50 connection(当每个应用程序开始使用自己的池时会发生这种情况) DBCP vs C3P0 Connection pool implementations Why to use a connection pool?

【讨论】:

还有 Tomcat JDBC 池 (people.apache.org/~fhanik/jdbc-pool/jdbc-pool.html) 应该考虑在内。

以上是关于连接池还是数据源?我应该把哪个放在JNDI中?的主要内容,如果未能解决你的问题,请参考以下文章

在tomcat下context.xml中配置各种数据库连接池(JNDI)

在tomcat下context.xml中配置各种数据库连接池

数据源,连接池,连接,jndi

谁在服务器中配置的 JNDI 数据源上执行连接? [复制]

连接池数据源JNDI三者间的关系及用法

《java数据源—连接池》