JdbcDataSource x JdbcConnectionPool

时间:2015-11-26 10:53:16

标签: jdbc jetty h2 hikaricp

我正在尝试理解JdbcDataSource和JdbcConnectionPool之间的目的和差异。

基于代码,JdbcDataSource或JdbcConnectionPool实现javax.sql.DataSource。

我的主要问题是:我什么时候应该使用其中一个?

我在jetty中创建了一个JNDI条目,如:

<New id="h2ds" class="org.eclipse.jetty.plus.jndi.Resource">
  <Arg><Ref refid="itracker" /></Arg>
  <Arg>jdbc/itracker_ds</Arg>
  <Arg>
    <New class="org.h2.jdbcx.JdbcDataSource">
      <Set name="url">db-url</Set>
      <Set name="password">user-password</Set>
      <Set name="user">user-password</Set>
    </New>
  </Arg>
</New>

我可以假设org.h2.jdbcx.JdbcDataSource像池一样工作,还是应该使用像DBCP或C3P0这样的池?

2 个答案:

答案 0 :(得分:2)

您永远不应该假设javax.sql.DataSource实现是连接池,尤其是如果它不包含与连接池配置相关的任何属性。

据我所知,org.h2.jdbcx.JdbcDataSource是一个简单的javax.sql.DataSource(和javax.sql.ConnectionPoolDataSource),提供连接池,而{ {3}}是javax.sql.DataSource并提供非常基本的连接池。

但是,在大多数情况下,如果您使用的是完整的应用程序服务器(Jetty不是),最好使用DBCP,HikariCP或C3p0或内置连接池。

请注意,javax.sql.ConnectionPoolDataSource的实现也不是连接池,它们旨在作为数据源提供可靠的连接提供连接池的DataSource(例如来自应用服务器)。

答案 1 :(得分:0)

我已更新配置以使用HikariCP。看看:

<New id="h2ds" class="org.eclipse.jetty.plus.jndi.Resource">
  <Arg><Ref refid="itracker" /></Arg>
  <Arg>jdbc/itracker_ds</Arg>
  <Arg>
    <New class="com.zaxxer.hikari.HikariDataSource">
      <Arg>
        <New class="com.zaxxer.hikari.HikariConfig">
          <Set name="maximumPoolSize">20</Set>
          <Set name="dataSourceClassName">org.h2.jdbcx.JdbcDataSource</Set>
          <Set name="password">db-password</Set>
          <Set name="username">db-user</Set>
          <Call name="addDataSourceProperty">
            <Arg>url</Arg>
            <Arg>db-url</Arg>
          </Call>
        </New>
      </Arg>
    </New>
  </Arg>
</New>

现在我真的在使用连接池。