返回介绍

11.1 连接数据源的源代码分析

发布于 2025-04-26 13:26:36 字数 5628 浏览 0 评论 0 收藏

要使用数据库,首先必须与数据库服务器建立连接。对于关系型数据库,Spring Boot 连接数据源一般都采用 JDBC(Java Data Base Connectivity)的方式来实现。其他类型的数据库却使用各自独立的方式来建立连接。代码清单 11-1 是 JDBC 的一些连接参数的定义,使用关系型数据库时,Spring Boot 的自动配置将尝试从应用的配置文件中读取这些配置项。

代码清单 11-1 数据源配置参数定义源代码

package org.springframework.boot.autoconfigure.jdbc;……





@ConfigurationProperties(
    prefix = "spring.datasource"
)
public class DataSourceProperties implements BeanClassLoaderAware, EnvironmentAware, InitializingBean {
    public static final String PREFIX = "spring.datasource";
    private ClassLoader classLoader;
    private Environment environment;
    private String name = "testdb";
    private Class<? extends DataSource> type;
    private String driverClassName;
    private String url;
    private String username;
    private String password;
    private String jndiName;
    private boolean initialize = true;
    private String platform = "all";
    private String schema;
    private String data;
    private boolean continueOnError = false;
    private String separator = ";";
    private Charset sqlScriptEncoding;
    private EmbeddedDatabaseConnection embeddedDatabaseConnection;
    private DataSourceProperties.Xa xa;
    ……





}

11.1.1 数据源类型和驱动

JDBC 连接数据源必须指定数据源类型和数据库驱动程序,在程序中用 driver-ClassName 来指定数据库驱动程序的名称,例如使用 MySQL 的驱动程序是 com.mysql.jdbc.Driver,而数据源的类型默认使用 org.apache.tomcat.jdbc.pool.DataSource,如代码清单 11-2 所示。

代码清单 11-2 JDBC 的 DataSourceBuilder 源代码片段

package org.springframework.boot.autoconfigure.jdbc;
    ……





public class DataSourceBuilder {
    private static final String[] DATA_SOURCE_TYPE_NAMES = new String[]{"org.apache.
tomcat.jdbc.pool.DataSource", "com.zaxxer.hikari.HikariDataSource", "org.apache.commons.dbcp.BasicDataSource", "org.apache.commons.dbcp2.BasicDataSource"};
    private Class<? extends DataSource> type;
    private ClassLoader classLoader;
    private Map<String, String> properties = new HashMap();
        ......
    public Class<? extends DataSource> findType() {
        if(this.type != null) {
            return this.type;
        } else {
            String[] var1 = DATA_SOURCE_TYPE_NAMES;
            int var2 = var1.length;
            int var3 = 0;
            while(var3 < var2) {
                String name = var1[var3];
                try {
                    return ClassUtils.forName(name, this.classLoader);
                } catch (Exception var6) {
                    ++var3;
                }
            }
            return null;
        }
    }
}

数据源的类型可以通过配置更改,这一功能给我们使用其他数据源提供了很大的便利。例如在第 4 章中使用 Druid 数据源时,就是使用如下的配置来指定数据源类型,即代码中的 type 设定为 com.alibaba.druid.pool.DruidDataSource。

spring:
    datasource:
        type: com.alibaba.druid.pool.DruidDataSource
        driver-class-name: com.mysql.jdbc.Driver
        ……





11.1.2 支持的数据库种类

Spring Boot 默认几乎可以支持现有的所有数据库,代码清单 11-3 是 DatabaseDriver 定义一个枚举类的源代码,从这个数据库驱动的定义列表中可以看出,它默认支持的数据库种类。但这并不是说,这个列表中没有列出的数据库就不支持了,只是可以采用其他方式来建立连接而已。例如,Redis、MongoDB、Neo4j 等数据库都使用了各自独特的方式来建立连接。

代码清单 11-3 枚举类 DatabaseDriver 源代码片段

package org.springframework.boot.autoconfigure.jdbc;……





enum DatabaseDriver {
    UNKNOWN((String)null),
    DERBY("org.apache.derby.jdbc.EmbeddedDriver"),
    H2("org.h2.Driver", "org.h2.jdbcx.JdbcDataSource"),
    HSQLDB("org.hsqldb.jdbc.JDBCDriver", "org.hsqldb.jdbc.pool.JDBCXADataSource"),
    SQLITE("org.sqlite.JDBC"),
    MYSQL("com.mysql.jdbc.Driver", "com.mysql.jdbc.jdbc2.optional.MysqlXAData
Source"),
    MARIADB("org.mariadb.jdbc.Driver", "org.mariadb.jdbc.MySQLDataSource"),
    GOOGLE("com.google.appengine.api.rdbms.AppEngineDriver"),
    ORACLE("oracle.jdbc.OracleDriver", "oracle.jdbc.xa.client.OracleXADataSource"),
    POSTGRESQL("org.postgresql.Driver", "org.postgresql.xa.PGXADataSource"),
    JTDS("net.sourceforge.jtds.jdbc.Driver"),
    SQLSERVER("com.microsoft.sqlserver.jdbc.SQLServerDriver", "com.microsoft.
sqlserver.jdbc.SQLServerXADataSource"),
    DB2("com.ibm.db2.jcc.DB2Driver", "com.ibm.db2.jcc.DB2XADataSource"),
    AS400("com.ibm.as400.access.AS400JDBCDriver", "com.ibm.as400.access.AS4
00JDBCXADataSource");
    private final String driverClassName;
    private final String xaDataSourceClassName;
    .....
}

11.1.3 与数据库服务器建立连接

最终,不管使用哪一种数据库,与数据库服务器建立连接大体上都会用到三个参数,即数据库链接地址、用户名和密码。下面我们来看一看,Spring Boot 在使用一个新型的数据库 Neo4j 时是怎么建立连接的。Neo4j 是一个 NoSQL 数据库,它不能使用 JDBC 的方式来建立连接,所以由 spring-data-neo4j 提供连接数据库服务器的方法。使用 Neo4j 数据库,一般使用如代码清单 11-4 所示的方法来连接数据库服务器,即通过继承 Neo4jConfiguration,重载 neo4jServer 方法来实现。

代码清单 11-4 连接 Neo4j 的配置类定义

@Configuration
......
public class Neo4jConfig extends Neo4jConfiguration {
    @Override
    public Neo4jServer neo4jServer() {
        return new RemoteServer("http://192.168.1.221:7474","neo4j","12345678");
    }
    ......
}

上面的代码最终将调用超类 Neo4jConfiguration 中的 constructSession 方法,使用提供的链接地址、用户名和密码,与数据库服务器建立连接,如代码清单 11-5 所示。

代码清单 11-5 Neo4j 连接服务器部分源代码

package org.springframework.data.neo4j.config;……





@Configuration
public abstract class Neo4jConfiguration {
    private Session constructSession(Neo4jServer server) {
        return server.url() != null && server.username() != null && server.
password() != null?this.getSessionFactory().openSession(server.url(), server.
username(), server.password()):this.getSessionFactory().openSession(server.url());
    }
    ……





}

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。