技术开发 频道

使用JDBC进行数据访问

控制如何连接数据库

DataSourceUtils
这个辅助类提供从JNDI获取连接和在必要时关闭连接的方法。它支持线程绑定的连接, 比如被用于DataSourceTransactionManager。

注意:方法getDataSourceFromJndi用以针对那些不使用BeanFactory或者ApplicationContext 的应用。对于后者,建议在factory中配置你的bean甚至JdbcTemplate的引用: 使用JndiObjectFactoryBean可以从JNDI中得到一个DataSource 并将DataSource的引用给别的bean。要切换到另一个DataSource 就仅仅是一个配置的问题:你甚至可以用一个非JNDI的DataSource来替换 FactoryBean的定义! 

SmartDataSource
实现这个接口的类可以提供一个关系数据库的连接。 它继承javax.sql.DataSource接口,使用它可以知道在一次数据库操作后, 是否需要关闭连接。如果我们需要重用一个连接,那么它对于效率是很有用的。

AbstractDataSource
这个实现Spring的DataSource的抽象类,关注一些"无趣"的东西。 如果你要写自己的DataSource实现,你可以继承这个类。 

SingleConnectionDataSource
这个SmartDataSource的实现封装了单个在使用后不会关闭的连接。 所以很明显,它没有多线程的能力。

如果客户端代码想关闭这个认为是池管理的连接,比如使用持久化工具的时候, 需要将suppressClose设置成true。这样会返回一个禁止关闭的代理来接管物理连接。 需要注意的是,你将无法将不再能将这个连接转换成本地Oracle连接或者类似的连接。

它的主要作用是用来测试。例如,它可以很容易的让测试代码脱离应用服务器测试,而只需要一个简易的JNDI环境。 和DriverManagerDataSource相反,它在所有的时候都重用一个连接, 以此来避免建立物理连接过多的消耗。

DriverManagerDataSource
这个SmartDataSource的实现通过bean的属性配置JDBC驱动, 并每次都返回一个新的连接。

它对于测试或者脱离J2EE容器的独立环境都是有用的, 它可以作为不同的ApplicationContext中的数据源bean, 也可以和简易的JNDI环境一起工作。被认为是池管理的Connection.close()操作 的调用只会简单的关闭连接,所以任何使用数据源的持久化代码都可以工作。

DataSourceTransactionManager
这个PlatformTransactionManager的实现是对于单个JDBC数据源的。 从某个数据源绑定一个JDBC连接到一个线程,可能允许每个数据源一个线程连接。

应用程序的代码需要通过DataSourceUtils.getConnection(DataSource)取得JDBC连接代替 J2EE标准的方法DataSource.getConnection。这是推荐的方法, 因为它会抛出org.springframework.dao中的unchecked的异常代替SQLException。 Framework中所有的类都使用这种方法,比如JdbcTemplate。 如果不使用事务管理,那么就会使用标准的方法,这样他就可以在任何情况下使用。

支持自定义的隔离级,以及应用于适当的JDBC statement查询的超时。 要支持后者,应用程序代码必须使用JdbcTemplate或者对每一个创建的statement 都调用DataSourceUtils.applyTransactionTimeout。

因为它不需要容器支持JTA,在只有单个资源的情况下, 这个实现可以代替JtaTransactionManager。 如果你坚持需要的连接的查找模式,两者间的切换只需要更换配置。 不过需要注意JTA不支持隔离级。

0
相关文章