相信很多coder到现在还没有真正明白数据源和连接池的概念,其实可以推荐去看一下javax.sql.DataSource的类注释,讲的很清楚:
这是其中的一部分
There are three types of implementations:
* <OL>
* <LI>Basic implementation -- produces a standard <code>Connection</code>
* object
* <LI>Connection pooling implementation -- produces a <code>Connection</code>
* object that will automatically participate in connection pooling. This
* implementation works with a middle-tier connection pooling manager.
* <LI>Distributed transaction implementation -- produces a
* <code>Connection</code> object that may be used for distributed
* transactions and almost always participates in connection pooling.
* This implementation works with a middle-tier
* transaction manager and almost always with a connection
* pooling manager.
* </OL>
也就是其是对于数据源来说,无非就是通过数据库用户名和密码还有数据库名去获取连接的一个地方,jdk 为我们提供了DataSource统一接口,具体数据源是由各个数据库厂商提供的,各个数据库厂商将会提供驱动包,开发的时候通过jdk提代的一个驱动管理器DriverManager来加载驱动去数据源获取一个有效的连接。
而连接池也只是数据源的实现之一,通过上面的注释可以看出来,数据源其实有三种实现:一是标准的实现,二是连接池的实现,三是分布式事务的实现。 对于第一种每次都会获取一个新的连接,而第二种将会对连接重复使用,使用后立即释放,以减少对系统内存的浪费,对于spring 有一个实现DriverManagerDataSource,它只是一个虚拟的connection pool,实际上每次连接还是要创建一个新的连接,要使用连接池,请看DriverManagerDataSource的类注释:
<p>If you need a "real" connection pool outside of a J2EE container, consider
* <a href="http://jakarta.apache.org/commons/dbcp">Apache's Jakarta Commons DBCP</a>
* or <a href="http://sourceforge.net/projects/c3p0">C3P0</a>.
* Commons DBCP's BasicDataSource and C3P0's ComboPooledDataSource are full
* connection pool beans, supporting the same basic properties as this class
* plus specific settings (such as minimal/maximal pool size etc).
推荐咱们使用jakarta的Commons DBCP还有C3P0 然后在服务器里面做相应的配置就可以使用连接池了。
dbcp没有自动的去回收空闲连接的功能c3p0有自动回收空闲连接功能