Java面试:数据源 javax.sql.DataSource

本文介绍了JDK1.4之后用于获得连接的工厂DataSource,它可替代DriverManager。还阐述了数据库连接池这一具体数据源实现方式及其工作原理,介绍了采用数据库连接池方案的Apache - commons - DBCP组件,以及BasicDataSource的常用属性。

DataSource数据源  是JDK1.4之后提供的用来获得连接的工厂,用来替代DriverManager。

数据库连接池:是一种具体的数据源的实现方式。

数据库连接池工作原理:  当服务器启动时,首先初始化一些链接放在连接池中,等待客户端请求链接,如果客户端请求链接了,首先查看连接池中是否有可用的链接,如果有则返回,如果没有则查看当前的连接数是否超过了最大可用链接,如果没有超过则创建新的链接返回给客户端,如果超过了,则等待,等待超时之后,抛出无可用链接的异常,最后当客户端使用完链接之后,再将链接放回到连接池中,从而实现链接的重用。

Apache-commons-DBCP组件:  采用了数据库连接池方案的数据源(javax.sql.DataSource)的具体实现组件(类库)

 

javax.sql.DataSource.java源码

package javax.sql;

import java.sql.Connection;
import java.sql.SQLException;
import java.sql.Wrapper;

public interface DataSource  extends CommonDataSource, Wrapper {

  /**
   * <p>Attempts to establish a connection with the data source that
   * this {@code DataSource} object represents.
   *
   * @return  a connection to the data source
   * @exception SQLException if a database access error occurs
   * @throws java.sql.SQLTimeoutException  when the driver has determined that the
   * timeout value specified by the {@code setLoginTimeout} method
   * has been exceeded and has at least tried to cancel the
   * current database connection attempt
   */
  Connection getConnection() throws SQLException;

  /**
   * <p>Attempts to establish a connection with the data source that
   * this {@code DataSource} object represents.
   *
   * @param username the database user on whose behalf the connection is
   *  being made
   * @param password the user's password
   * @return  a connection to the data source
   * @exception SQLException if a database access error occurs
   * @throws java.sql.SQLTimeoutException  when the driver has determined that the
   * timeout value specified by the {@code setLoginTimeout} method
   * has been exceeded and has at least tried to cancel the
   * current database connection attempt
   * @since 1.4
   */
  Connection getConnection(String username, String password)
    throws SQLException;
}

 

org.apache.commons.dbcp

许多Apache项目都支持与关系数据库的交互。为每个用户创建新连接可能非常耗时(通常需要多秒的时钟时间),以便执行可能需要几毫秒的数据库事务。在公共托管的Internet应用程序中,每个用户打开一个连接可能是不可行的,因为同时用户的数量可能非常大。因此,开发人员通常希望在所有应用程序的当前用户之间共享打开连接的“池”。在任何给定时间实际执行请求的用户数通常占活动用户总数的很小百分比,并且在请求处理期间是唯一需要数据库连接的时间。应用程序本身登录到DBMS,并在内部处理任何用户帐户问题。

Apache产品和其他地方都有几个数据库连接池。此Commons软件包提供了一个机会,可以协调在ASF许可下创建和维护高效,功能丰富的软件包所需的工作。

BasicDataSource

常用属性:url username password driverClassName

 

 

 

 

 

org.apache.ibatis.exceptions.PersistenceException: ### Error building SqlSession. ### The error may exist in SQL Mapper Configuration ### Cause: org.apache.ibatis.builder.BuilderException: Error parsing SQL Mapper Configuration. Cause: org.apache.ibatis.datasource.DataSourceException: Unknown DataSource property: maxPoolPreparedStatementPerConnectionSize org.apache.ibatis.exceptions.ExceptionFactory.wrapException(ExceptionFactory.java:30) org.apache.ibatis.session.SqlSessionFactoryBuilder.build(SqlSessionFactoryBuilder.java:80) org.apache.ibatis.session.SqlSessionFactoryBuilder.build(SqlSessionFactoryBuilder.java:64) com.ks.Servlet.loginServlet.doGet(loginServlet.java:28) javax.servlet.http.HttpServlet.service(HttpServlet.java:655) javax.servlet.http.HttpServlet.service(HttpServlet.java:764) org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53) 根本原因。 org.apache.ibatis.builder.BuilderException: Error parsing SQL Mapper Configuration. Cause: org.apache.ibatis.datasource.DataSourceException: Unknown DataSource property: maxPoolPreparedStatementPerConnectionSize org.apache.ibatis.builder.xml.XMLConfigBuilder.parseConfiguration(XMLConfigBuilder.java:121) org.apache.ibatis.builder.xml.XMLConfigBuilder.parse(XMLConfigBuilder.java:99) org.apache.ibatis.session.SqlSessionFactoryBuilder.build(SqlSessionFactoryBuilder.java:78) org.apache.ibatis.session.SqlSessionFactoryBuilder.build(SqlSessionFactoryBuilder.java:64) com.ks.Servlet.loginServlet.doGet(loginServlet.java:28) javax.servlet.http.HttpServlet.service(HttpServlet.java:655) javax.servlet.http.HttpServlet.service(HttpServlet.java:764) org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53) 根本原因。 org.apache.ibatis.datasource.DataSourceException: Unknown DataSource property: maxPoolPreparedStatementPerConnectionSize org.apache.ibatis.datasource.unpooled.UnpooledDataSourceFactory.setProperties(UnpooledDataSourceFactory.java:55) org.apache.ibatis.builder.xml.XMLConfigBuilder.dataSourceElement(XMLConfigBuilder.java:326) org.apache.ibatis.builder.xml.XMLConfigBuilder.environmentsElement(XMLConfigBuilder.java:280) org.apache.ibatis.builder.xml.XMLConfigBuilder.parseConfiguration(XMLConfigBuilder.java:116) org.apache.ibatis.builder.xml.XMLConfigBuilder.parse(XMLConfigBuilder.java:99) org.apache.ibatis.session.SqlSessionFactoryBuilder.build(SqlSessionFactoryBuilder.java:78) org.apache.ibatis.session.SqlSessionFactoryBuilder.build(SqlSessionFactoryBuilder.java:64) com.ks.Servlet.loginServlet.doGet(loginServlet.java:28) javax.servlet.http.HttpServlet.service(HttpServlet.java:655) javax.servlet.http.HttpServlet.service(HttpServlet.java:764) org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53)
05-10
<think>我们正在解决的是Nacos启动时出现的`spring.datasource.type`绑定失败问题,具体错误信息可能是:`Failedtobindpropertiesunder'spring.datasource.type'tojava.lang.Class<javax.sql.DataSource>`并且根本原因是类`com.alibaba.druid.pool.DruidDataSource`未找到(ClassNotFoundException)。根据引用内容,我们可以分析可能的原因和解决方案:**可能原因分析:**1.**依赖缺失**:项目中未正确引入Druid数据库连接池的依赖。2.**配置冲突**:可能存在多个配置文件(如application.properties和application.yml)冲突,或者配置项错误。3.**加密配置问题**:如果使用了jasypt加密,可能会导致动态刷新时出现问题(但当前问题更可能是类找不到)。4.**环境问题**:在命令行启动时可能缺少必要的参数或环境配置。**解决方案:**###步骤1:确认Druid依赖确保在项目的`pom.xml`(Maven项目)中已正确引入Druid依赖:```xml<dependency><groupId>com.alibaba</groupId><artifactId>druid-spring-boot-starter</artifactId><version>${druid.version}</version><!--例如1.2.8--></dependency>```如果未添加,请添加后重新构建项目。###步骤2:检查配置文件-**避免配置文件重复**:检查是否同时存在`application.properties`和`application.yml`,并且两个文件中都配置了`spring.datasource`相关属性。建议只保留一个配置文件(引用[3]中提到的问题就是同时存在两个配置文件且配置重复导致绑定失败)。-**正确配置数据源类型**:在配置文件中,确保`spring.datasource.type`的值为Druid数据源类的全限定名:```propertiesspring.datasource.type=com.alibaba.druid.pool.DruidDataSource```或者在YAML中:```yamlspring:datasource:type:com.alibaba.druid.pool.DruidDataSource```###步骤3:检查类路径确认Druid的JAR包是否已正确打包到应用的类路径中。可以通过以下方式检查:-如果是可执行JAR,运行:```cmdjartfyour-application.jar|grepdruid```查看输出中是否包含druid相关的jar包。###步骤4:处理加密配置(如果使用)如果数据库密码使用了jasypt加密,确保在启动时通过参数指定加密密码(引用[4]):```cmdjava-jar-Djasypt.encryptor.password=yourpasswordyour-application.jar```但注意,当前问题主要是类找不到,所以加密问题可能是次要的,但若同时存在则需处理。###步骤5:清理和重新构建-清理项目(如使用Maven:`mvnclean`),然后重新构建(`mvnpackage`)。-确保构建过程中没有错误,并且依赖被正确下载。###步骤6:检查依赖冲突使用`mvndependency:tree`查看是否有依赖冲突,特别是不同版本的Druid。如果有冲突,需要排除多余的版本。###步骤7:检查启动命令确保启动命令正确,特别是当使用命令行启动时,要确保在正确的目录下,并且命令参数正确(引用[4]中提到的在PowerShell中可能有问题,换用cmd解决)。###示例:正确启动命令```cmdjava-jar-Djasypt.encryptor.password=yourpasswordnacos-application.jar```**总结**:该问题最常见的原因是**缺少Druid依赖**或**配置文件中数据源类型配置错误**。请按照上述步骤逐一排查。§§相关问题§§1.如何解决Nacos配置中心动态刷新时Druid数据源加密配置的异常?2.如何在SpringBoot中正确配置多数据源?3.Maven依赖冲突如何排查和解决?4.Nacos配置中心如何集成jasypt加密?</think>### 解决 Nacos 启动时 `spring.datasource.type` 绑定失败问题 根据引用内容分析,您遇到的 `Failed to bind properties under 'spring.datasource.type'` 错误(特别是 `ClassNotFound: com.alibaba.druid.pool.DruidDataSource`)通常由以下原因导致,以下是逐步解决方案: --- ### **根本原因分析** 1. **Druid 依赖缺失** (最常见原因) - 项目未正确引入 Druid 数据库连接池依赖 - Maven/Gradle 依赖配置错误或版本冲突 2. **配置文件冲突** - 同时存在 `application.properties` 和 `application.yml` 文件且配置冲突(引用[3]) - 配置文件中 `spring.datasource.type` 指定了不存在的类 3. **加密配置问题** - 若使用 jasypt 加密数据库密码,需特殊处理动态刷新机制(引用[2][4]) --- ### **解决方案** #### 步骤 1:添加 Druid 依赖 在 `pom.xml` 中添加最新版本 Druid 依赖: ```xml <dependency> <groupId>com.alibaba</groupId> <artifactId>druid-spring-boot-starter</artifactId> <version>1.2.18</version> <!-- 检查最新版本 --> </dependency> ``` **关键操作**: - 执行 `mvn clean install` 确保依赖下载 - 检查打包后 JAR 中是否包含 `druid-*.jar` 文件 #### 步骤 2:修复配置文件 1. **统一配置文件格式**: - 删除冗余的 `application.properties` 或 `application.yml`(保留一个即可,引用[3]) - 推荐使用 YAML 格式(避免 properties 文件中的格式错误) 2. **正确配置数据源类型**: ```yaml spring: datasource: type: com.alibaba.druid.pool.DruidDataSource # 完整类路径 url: jdbc:mysql://localhost:3306/nacos username: nacos_user password: your_password driver-class-name: com.mysql.cj.jdbc.Driver ``` #### 步骤 3:处理加密配置(若使用 jasypt) 1. **启动时注入密钥**(引用[4]): ```cmd java -jar -Djasypt.encryptor.password=yourSecretKey nacos-server.jar ``` 2. **配置文件中使用加密值**: ```properties spring.datasource.password=ENC(加密后的字符串) ``` #### 步骤 4:排查依赖冲突 检查是否存在多个数据源依赖: ```cmd mvn dependency:tree | grep -E 'druid|hikari|tomcat-jdbc' ``` - 移除冲突依赖:`<exclusion>...</exclusion>` - 确保只保留 Druid 依赖 --- ### **验证方案** 1. **检查类加载**: 在启动类中添加诊断代码: ```java public static void main(String[] args) { try { Class.forName("com.alibaba.druid.pool.DruidDataSource"); System.out.println("Druid 类加载成功 ✔"); } catch (ClassNotFoundException e) { System.err.println("Druid 类未找到 ✘"); } SpringApplication.run(NacosApplication.class, args); } ``` 2. **启动命令验证**: ```cmd # Windows CMD 执行(避免 PowerShell 兼容问题) cd /d D:\nacos\bin startup.cmd -m standalone ``` --- ### **预防措施** 1. **配置规范**: - 避免混合使用 properties 和 YAML 配置 - 使用 `@ConfigurationProperties(prefix = "spring.datasource")` 绑定配置 2. **版本兼容性**: ```xml <!-- 确保版本兼容 --> <dependency> <groupId>com.alibaba.nacos</groupId> <artifactId>nacos-config-server</artifactId> <version>2.2.3</version> </dependency> <dependency> <groupId>com.alibaba</groupId> <artifactId>druid-spring-boot-starter</artifactId> <version>1.2.18</version> </dependency> ``` > 通过上述步骤,90% 以上的 `ClassNotFound: DruidDataSource` 问题可解决。若仍存在问题,需检查类加载器隔离或部署环境[^1][^3]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值