1、使用org.springframework.jdbc.datasource.DriverManagerDataSource
说明:DriverManagerDataSource 建立连接是只要有连接就新建一个 connection,根本没有连接池的作用。
2、使用org.apache.commons.dbcp.BasicDataSource
说明:这是一种推荐说明的数据源配置方式,它真正使用了连接池技术
3、使用org.springframework.jndi.JndiObjectFactoryBean
说明:JndiObjectFactoryBean 能够通过 JNDI 获取 DataSource
总结:3种方式中的第一种没有使用连接池,故少在项目中用到,第三种方式需要在 web server 中配置数据源,不方便于部署,本人推荐使用每二种方式进行数据源的配置。
配置一个数据源
Spring 在第三方依赖包中包含了两个数据源的实现类包,其一是 Apache 的 DBCP,其二是 C3P0。可以在 Spring 配置文件中利用这两者中任何一个配置数据源。
DBCP数据源
DBCP 类包位于 <spring_home></spring_home>/lib/jakarta-commons/commons-dbcp.jar,DBCP 是一个依赖 Jakarta commons-pool 对象池机制的数据库连接池,所以在类路径下还必须包括 <spring_home></spring_home>/lib/jakarta- commons/commons-pool.jar。下面是使用 DBCP 配置 MySql 数据源的配置片断:
BasicDataSource 提供了 close() 方法关闭数据源,所以必须设定 destroy-method=”close” 属性, 以便 Spring 容器关闭时,数据源能够正常关闭。除以上必须的数据源属性外,还有一些常用的属性:
C3P0数据源
C3P0 是一个开放源代码的 JDBC 数据源实现项目,它在 lib 目录中与 Hibernate 一起发布,实现了 JDBC3 和 JDBC2 扩展规范说明的 Connection 和 Statement 池。C3P0类包位于<spring_home></spring_home>/lib/c3p0/c3p0-0.9.0.4.jar。下面是使用 C3P0 配置一个 Oracle 数据源:
ComboPooledDataSource 和 BasicDataSource 一样提供了一个用于关闭数据源的 close() 方法,这样我们就可以保证 Spring 容器关闭时数据源能够成功释放。
C3P0 拥有比 DBCP 更丰富的配置属性,通过这些属性,可以对数据源进行各种有效的控制:
读配置文件的方式引用属性:
在jdbc.properties属性文件中定义属性值:
提示 经常有开发者在${xxx}的前后不小心键入一些空格,这些空格字符将和变量合并后作为属性的值。如: <property name="username" value=" ${jdbc.username} "></property> 的属性配置项,在前后都有空格,被解析后,username的值为“ 1234 ”,这将造成最终的错误,因此需要特别小心。
获取JNDI数据源
如果应用配置在高性能的应用服务器(如WebLogic或Websphere等)上,我们可能更希望使用应用服务器本身提供的数据源。应用服务器的数据源 使用JNDI开放调用者使用,Spring为此专门提供引用JNDI资源的JndiObjectFactoryBean类。下面是一个简单的配置:
通过 jndiName 指定引用的 JNDI 数据源名称。
Spring 2.0 为获取 J2EE 资源提供了一个 jee 命名空间,通过 jee 命名空间,可以有效地简化 J2EE 资源的引用。下面是使用 jee 命名空间引用 JNDI 数据源的配置:
Spring的数据源实现类
Spring本身也提供了一个简单的数据源实现类 DriverManagerDataSource ,它位于 org.springframework.jdbc.datasource 包中。这个类实现了 javax.sql.DataSource 接口,但 它并没有提供池化连接的机制,每次调用 getConnection() 获取新连接时,只是简单地创建一个新的连接。因此,这个数据源类比较适合在单元测试 或简单的独立应用中使用,因为它不需要额外的依赖类。
下面,我们来看一下 DriverManagerDataSource 的简单使用:当然,我们也可以通过配置的方式直接使用 DriverManagerDataSource。
DBCP 与 C3PO 配置的区别:
DBCP 没有自动的去回收空闲连接的功能, C3PO 有自动回收空闲连接功能.
小结
不管采用何种持久化技术,都需要定义数据源。Spring 附带了两个数据源的实现类包,你可以自行选择进行定义。在实际部署时,我们可能会直接采用应用服 务器本身提供的数据源,这时,则可以通过 JndiObjectFactoryBean 或 jee 命名空间引用 JNDI 中的数据源。