MapperScannerConfigurer 配置出错造成没有读取 db.properties 文件中的数据库连接参数

news/2024/12/20 12:38:34/文章来源:https://www.cnblogs.com/hexff/p/18615307

MyBatis-Spring 实现 MyBatis 和 Spring 框架集成。

问题现象

在配置中碰到不能加载 MySQL JDBC 驱动的问题,报错如下(部分截取):

09:59:06.595 [C3P0PooledConnectionPoolManager[identityToken->z8kfltb71qnbl7e1cco0kz|23833818]-HelperThread-#2] WARN  c.m.v2.c3p0.DriverManagerDataSource - Could not load driverClass ${jdbc.driverClass}java.lang.ClassNotFoundException: ${jdbc.driverClass}at org.apache.catalina.loader.WebappClassLoaderBase.loadClass(WebappClassLoaderBase.java:1332)at org.apache.catalina.loader.WebappClassLoaderBase.loadClass(WebappClassLoaderBase.java:1144)at java.base/java.lang.Class.forName0(Native Method)at java.base/java.lang.Class.forName(Class.java:534)at java.base/java.lang.Class.forName(Class.java:513)at com.mchange.v2.c3p0.DriverManagerDataSource.loadDriverClass(DriverManagerDataSource.java:129)at com.mchange.v2.c3p0.DriverManagerDataSource.ensureIfPossibleDriverClassLoaded(DriverManagerDataSource.java:108)at com.mchange.v2.c3p0.DriverManagerDataSource.getConnection(DriverManagerDataSource.java:157)at com.mchange.v2.c3p0.WrapperConnectionPoolDataSource.getPooledConnection(WrapperConnectionPoolDataSource.java:167)at com.mchange.v2.c3p0.WrapperConnectionPoolDataSource.getPooledConnection(WrapperConnectionPoolDataSource.java:153)at com.mchange.v2.c3p0.impl.C3P0PooledConnectionPool$1PooledConnectionResourcePoolManager.acquireResource(C3P0PooledConnectionPool.java:499)at com.mchange.v2.resourcepool.BasicResourcePool.doAcquire(BasicResourcePool.java:1112)at com.mchange.v2.resourcepool.BasicResourcePool.doAcquireAndDecrementPendingAcquiresWithinLockOnSuccess(BasicResourcePool.java:1099)at com.mchange.v2.resourcepool.BasicResourcePool.access$700(BasicResourcePool.java:9)at com.mchange.v2.resourcepool.BasicResourcePool$ScatteredAcquireTask.run(BasicResourcePool.java:1846)at com.mchange.v2.async.ThreadPoolAsynchronousRunner$PoolThread.run(ThreadPoolAsynchronousRunner.java:696)
Caused by: java.sql.SQLException: No suitable driverat java.sql/java.sql.DriverManager.getDriver(DriverManager.java:300)at com.mchange.v2.c3p0.DriverManagerDataSource.driver(DriverManagerDataSource.java:273)at com.mchange.v2.c3p0.DriverManagerDataSource.getConnection(DriverManagerDataSource.java:159)at com.mchange.v2.c3p0.WrapperConnectionPoolDataSource.getPooledConnection(WrapperConnectionPoolDataSource.java:167)at com.mchange.v2.c3p0.WrapperConnectionPoolDataSource.getPooledConnection(WrapperConnectionPoolDataSource.java:153)at com.mchange.v2.c3p0.impl.C3P0PooledConnectionPool$1PooledConnectionResourcePoolManager.acquireResource(C3P0PooledConnectionPool.java:499)at com.mchange.v2.resourcepool.BasicResourcePool.doAcquire(BasicResourcePool.java:1112)at com.mchange.v2.resourcepool.BasicResourcePool.doAcquireAndDecrementPendingAcquiresWithinLockOnSuccess(BasicResourcePool.java:1099)at com.mchange.v2.resourcepool.BasicResourcePool.access$700(BasicResourcePool.java:9)at com.mchange.v2.resourcepool.BasicResourcePool$ScatteredAcquireTask.run(BasicResourcePool.java:1846)at com.mchange.v2.async.ThreadPoolAsynchronousRunner$PoolThread.run(ThreadPoolAsynchronousRunner.java:696)

环境配置

SSM 框架集成的主要配置如下:

依赖:

        <dependency><groupId>org.mybatis</groupId><artifactId>mybatis</artifactId><version>3.5.17</version></dependency><dependency><groupId>org.mybatis</groupId><artifactId>mybatis-spring</artifactId><version>3.0.4</version></dependency><dependency><groupId>com.mchange</groupId><artifactId>c3p0</artifactId><version>0.10.1</version></dependency><dependency><groupId>com.mysql</groupId><artifactId>mysql-connector-j</artifactId><version>9.1.0</version><scope>runtime</scope></dependency>

db.properties:

jdbc.driverClass=com.mysql.cj.jdbc.Driver
jdbc.jdbcUrl=jdbc:mysql://127.0.0.1/java
jdbc.user=root
jdbc.password=root

spring.xml:

<?xml version="1.0" encoding="UTF-8" ?>
<beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:context="http://www.springframework.org/schema/context"xmlns:tx="http://www.springframework.org/schema/tx"xmlns:aop="http://www.springframework.org/schema/aop"xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsdhttp://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsdhttp://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd"><context:component-scan base-package="cn.oraenv.javaweb.dao"/><aop:aspectj-autoproxy/><context:property-placeholder location="classpath:db.properties"/><bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource"><property name="driverClass" value="${jdbc.driverClass}"/><property name="jdbcUrl" value="${jdbc.jdbcUrl}"/><property name="user" value="${jdbc.user}"/><property name="password" value="${jdbc.password}"/></bean><bean name="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"><property name="dataSource" ref="dataSource"/></bean><tx:annotation-driven/><bean name="sqlSessionFactoryBean" class="org.mybatis.spring.SqlSessionFactoryBean"><property name="dataSource" ref="dataSource"/><property name="configLocation" value="classpath:mybatis-config.xml"/></bean><bean class="org.mybatis.spring.mapper.MapperScannerConfigurer"><property name="sqlSessionFactory" ref="sqlSessionFactoryBean"/><property name="basePackage" value="cn.oraenv.javaweb.dao"/></bean>
</beans>

问题解析

根据异常报错信息可以看出 JDBC 驱动的类全路经名没有替换为 db.properties 文件中的值,从而造成不能加载 MySQL 的 JDBC 驱动。

经过排查后发现是 MapperScannerConfigurer 的配置出错,使用 sqlSessionFactory 属性名以 ref 方式进行注入,会造成 org.mybatis.spring.SqlSessionFactoryBean 提前初始化,但是此时 ${jdbc.driverClass} 等参数的替换还未开始,无法读取到正确的数据库连接配置。

官方文档中对 MapperScannerConfigurer 的配置方法描述如下:

配置细节的官方文档

下面总结 MapperScannerConfigurer 的配置方法:

  1. 如果 Spring 上下文中只有一个 sqlSessionFactory,那么不用手动注入 sqlSessionFactory 属性;
  2. 如果 Spring 上下文中有多个 sqlSessionFactory, 那么使用 sqlSessionFactoryBeanName 属性以 value 方式注入字符串的 Bean 名称。

修改后的配置段如下:

    <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer"><property name="sqlSessionFactoryBeanName" value="sqlSessionFactoryBean"/><property name="basePackage" value="cn.oraenv.javaweb.dao"/></bean>

至此数据库连接正常。

刚开始配置的时候以为加了这项配置也不要紧,不以为然,谁成想出现这样的错误,最后通过排查和查资料,定位解决了这个问题。

问题还涉及 Bean 的生命周期和后处理的相关知识,现在水平还不到,放到以后学习。

参考链接

  1. https://mybatis.org/spring/mappers.html#mapperscannerconfigurer

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/855798.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

聊一聊坑人的 C# MySql.Data SDK

一:背景 1. 讲故事 为什么说这东西比较坑人呢?是因为最近一个月接到了两个dump,都反应程序卡死无响应,最后分析下来是因为线程饥饿导致,那什么原因导致的线程饥饿呢?进一步分析发现罪魁祸首是 MySql.Data,这就让人无语了,并且反馈都是升级了MySql.Data驱动引发,接下来…

如何提高测试过程效率?

前几天写了一篇文章,分享了一些工作汇报的方法和案例,详情见《如何编写年度工作汇报PPT》。 后台有同学留言,对质量度量和测试提效部分提了几个问题,核心集中在如何提高测试过程效率方面。 我在前面写过几篇关于测试提效的文章,分别聊到了影响测试效率的因素,测试团队要提…

真保姆级——在VMware的Ubuntukylin上进行Hadoop单机_伪分布式安装时安装VMware_Tools后虚拟机与物理机之间无法传输文件和复制粘贴的问题(附Ubuntu更改默认登录用户)

目录一、前言二、版本信息三、hadoop用户创建1.创建hadoop用户2.在创建hadoop用户后对系统进行重启四、解决办法4.1 更改默认登陆用户4.2 安装VMware Tools4.3 验证VMware Tools是否安装成功4.4 KO!!!4.4.1 卸载安装的Vmware Tools4.4.2 安装VMware Tools所需的组件五、可能…

菱形计数与最值问题

菱形计数与最值问题题面你有一个边长为 \(n\) 的正六边形。它被划分成了若干个边长为 \(1\) 的小等边三角形。 我们希望通过合并若干对有公共边的三角形,把这个六边形变成若干个边长为 \(1\) 的菱形的划分。对于每对三角形之间,它们合并有一个代价,问最小的总代价是多少。 例…

钉钉机器人 自动化发版

开发机器人接收消息并调用构建接口, 实现自动化发版 发送指令 -> 机器人接收指令 -> 调用jenkins-job远程构建与部署钉钉机器人 自动化发版 #1 简介开发机器人接收消息并调用构建接口, 实现自动化发版 发送指令 -> 机器人接收指令 -> 调用jenkins-job远程构建与部…

ChCore-Lab4

lab 4: 多核调度与IPC 结合IPADS OS Lab Manual一起阅读,风味更佳!多核启动支持:使ChCore通过树莓派厂商所提供的固件唤醒多核执行 多核调度: 使ChCore实现在多核上进行round-robin调度。 IPC:使ChCore支持进程间通信 IPC调优:为ChCore的IPC针对测试的特点进行调优。踩坑1…

DNS 服务器是什么?有什么作用?

DNS 服务器是什么?有什么作用 一、DNS 服务器的定义 DNS 服务器即域名系统(Domain Name System)服务器。它是一种在互联网基础设施中扮演关键角色的服务器。在互联网的世界里,每台设备(如服务器、计算机等)都有一个唯一的 IP 地址,就像每部电话都有一个电话号码一样。但…

spring-boot-starter-security放行全部请求

Spring Boot项目中加了spring-boot-starter-security默认会把全部请求设置要求登录。 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-security</artifactId> </dependency>系统自动建一个user…

提升分析效率的秘密:电商团队用它打破数据孤岛!

高效团队协作:电商团队如何用在线协同工具重塑商品数据分析流程 在如今竞争激烈的电商行业中,商品数据分析的重要性不言而喻。销售数据、库存情况、用户反馈等信息都可能成为制胜关键。然而,这些数据往往分散在不同系统中,导致团队协作效率低下。尤其是在电商团队中,数据分…

zabbix图形乱码问题

环境: OS:Centos 7 zabbix:4.0.5

OpenCL 编程步骤 3. 获取Context 上下文

转载 https://deepinout.com/opencl/opencl-basic-tutorials/opencl-create-context.html 上下文为关联的设备、内存对象、命令队列、程序对象、内核对象提供一个容器。上下文是OpenCL应用的核心。正是上下文驱动着应用程序与特定设备以及特定设备之间的通信。 对于上下文中关联…

Gitlab runner持续集成CI/CD怎么设置标签指定Runner节点执行

搭建Runner参考: https://www.cnblogs.com/minseo/p/18472436 需求:未打标签的.gitlab-ci使用默认runner 打标签的.gitlab-ci使用指定的runner环境查看 系统环境# cat /etc/redhat-release Rocky Linux release 9.3 (Blue Onyx) # uname -a Linux Rocky9StoneCrm003080 5.14.…