10.2.3 基于 JDBC 驱动的数据源

在 Spring 中,通过 JDBC 驱动定义数据源是最简单的配置方式。Spring 提供了三个这样的数据源类(均位于 org.springframework.jdbc.datasource 包中)供选择:

  • DriverManagerDataSource:在每个连接请求时都会返回一个新建的连接。与 DBCP 的 BasicDataSource 不同, 由 DriverManagerDataSource 提供的连接并没有进行池化管理;

  • SimpleDriverDataSource:与 DriverManagerDataSource 的工作方式类似,但是它直接使用 JDBC 驱动,来解决在特定环境下的类加载问题,这样的环境包括 OSGi 容器;

  • SingleConnectionDataSource:在每个连接请求时都会返回同一个的连接。尽管 SingleConnectionDataSource 不是严格意义上的连接池数据源,但是你可以将其视为只有一个连接的池。

以上这些数据源的配置与 DBCPBasicDataSource 的配置类似。例如,如下就是配置 DriverManagerDataSource 的方法:

@Bean
public DataSource dataSource() {
  DriverManagerDataSource ds = new DriverManagerDataSource();
  ds.setDriverClassName("org.h2.Driver");
  ds.setUrl("jdbc:h2:tcp://localhost/~/spitter");
  ds.setUsername("sa");
  ds.setPassword("");
  return ds;
}

如果使用 XML 的话,DriverManagerDataSource 可以按照如下的方式配置:

<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource"
      p:driverClassName="org.h2.Driver"
      p:url="jdbc:h2:tcp://localhost/~/spitter"
      p:username="sa"
      p:password="" />

与具备池功能的数据源相比,唯一的区别在于这些数据源 bean 都没有提供连接池功能,所以没有可配置的池相关的属性。

尽管这些数据源对于小应用或开发环境来说是不错的,但是要将其用于生产环境,你还是需要慎重考虑。因为 SingleConnectionDataSource 有且只有一个数据库连接,所以不适合用于多线程的应用程序,最好只在测试的时候使用。而 DriverManagerDataSource 和 SimpleDriverDataSource 尽管支持多线程,但是在每次请求连接的时候都会创建新连接,这是以性能为代价的。鉴于以上的这些限制,我强烈建议应该使用数据源连接池。

Last updated