MyBatis连接数据库失败可能的原因

MyBatis连接数据库失败可能的原因

Logging initialized using ‘class org.apache.ibatis.logging.stdout.StdOutImpl’ adapter.
PooledDataSource forcefully closed/removed all connections.
PooledDataSource forcefully closed/removed all connections.
PooledDataSource forcefully closed/removed all connections.
PooledDataSource forcefully closed/removed all connections.
Exception in thread “main” org.apache.ibatis.exceptions.PersistenceException:
Error building SqlSession.
The error may exist in com/bjpowernode/dao/Studentao.xml
Cause: org.apache.ibatis.builder.BuilderException: Error parsing SQL Mapper Configuration. Cause: java.io.IOException: Could not find resource com/bjpowernode/dao/Studentao.xml
at org.apache.ibatis.exceptions.ExceptionFactory.wrapException(ExceptionFactory.java:30)
at org.apache.ibatis.session.SqlSessionFactoryBuilder.build(SqlSessionFactoryBuilder.java:80)
at org.apache.ibatis.session.SqlSessionFactoryBuilder.build(SqlSessionFactoryBuilder.java:64)
at com.bjpowernode.MyApp.main(MyApp.java:24)
Caused by: org.apache.ibatis.builder.BuilderException: Error parsing SQL Mapper Configuration. Cause: java.io.IOException: Could not find resource com/bjpowernode/dao/Studentao.xml
at org.apache.ibatis.builder.xml.XMLConfigBuilder.parseConfiguration(XMLConfigBuilder.java:121)
at org.apache.ibatis.builder.xml.XMLConfigBuilder.parse(XMLConfigBuilder.java:98)
at org.apache.ibatis.session.SqlSessionFactoryBuilder.build(SqlSessionFactoryBuilder.java:78)
… 2 more
Caused by: java.io.IOException: Could not find resource com/bjpowernode/dao/Studentao.xml
at org.apache.ibatis.io.Resources.getResourceAsStream(Resources.java:114)
at org.apache.ibatis.io.Resources.getResourceAsStream(Resources.java:100)
at org.apache.ibatis.builder.xml.XMLConfigBuilder.mapperElement(XMLConfigBuilder.java:371)
at org.apache.ibatis.builder.xml.XMLConfigBuilder.parseConfiguration(XMLConfigBuilder.java:119)
… 4 more

百度之后,以为是自己的MySQL版本是8.0以上的,因此需要将

<property name="url" value="jdbc:mysql://localhost:3306/onlinedb"/>

变为:`

```xml
<property name="url" value="jdbc:mysql://localhost:3306/onlinedb?useUnicode=true&amp;characterEncoding=utf8"/>

经查验mysql版本后
在这里插入图片描述
mysql并不是8.0以上版本,因此错误不在这。然后顺着mybatis的基本步骤再次检查了一遍。

1.加入maven的依赖

<dependency>
      <groupId>org.mybatis</groupId>
      <artifactId>mybatis</artifactId>
      <version>3.5.1</version>
    </dependency>

这里并没有问题。

2.创建Dao接口:定义操作数据的方法,创建mapper文件,也叫做sql映射文件:写sql语句,和接口中方法对应的sql语句

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.bjpowernode.dao.StudentDao">
	<select id="selectStudents" resultType="com.bjpowernode.domain.Student" >
        select id,name,email,age from student order by id
    </select>
</mapper>

这里也没有问题

3.创建mybatis的一个主配置文件:1)连接数据库 2)指定mapper文件的位置

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
        PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
    <!--settings:控制mybatis全局行为-->
    <settings>
        <!--设置mybatis输出日志-->
        <setting name="logImpl" value="STDOUT_LOGGING" />
    </settings>

    <!--环境配置: 数据库的连接信息
        default:必须和某个environment的id值一样。
        告诉mybatis使用哪个数据库的连接信息。也就是访问哪个数据库
    -->
    <environments default="mysql0728">
        <!-- environment : 一个数据库信息的配置, 环境
             id:一个唯一值,自定义,表示环境的名称。
        -->
        <environment id="mysql0728">
            <!--
               transactionManager :mybatis的事务类型
                   type: JDBC(表示使用jdbc中的Connection对象的commit,rollback做事务处理)
            -->
            <transactionManager type="JDBC"/>
            <!--
               dataSource:表示数据源,连接数据库的
                  type:表示数据源的类型, POOLED表示使用连接池
            -->
            <dataSource type="POOLED">
                <!--
                   driver, user, username, password 是固定的,不能自定义。
                -->
                <!--数据库的驱动类名-->
                <property name="driver" value="com.mysql.jdbc.Driver"/>
                <!--连接数据库的url字符串-->
                <property name="url" value="jdbc:mysql://localhost:3306/springdb" />
                <!--访问数据库的用户名-->
                <property name="username" value="root"/>
                <!--密码-->
                <property name="password" value="12345"/>
            </dataSource>
        </environment>


        <!--表示线上的数据库,是项目真实使用的库-->
        <environment id="online">
            <transactionManager type="JDBC"/>
            <dataSource type="POOLED">
                <property name="driver" value="com.mysql.jdbc.Driver"/>
                <property name="url" value="jdbc:mysql://localhost:3306/onlinedb"/>
                <property name="username" value="root"/>
                <property name="password" value="fhwertwr"/>
            </dataSource>
        </environment>
    </environments>

    <!-- sql mapper(sql映射文件)的位置-->
    <mappers>
        <!--一个mapper标签指定一个文件的位置。
           从类路径开始的路径信息。  target/clasess(类路径)
        -->
        <mapper resource="com/bjpowernode/Dao/Student.xml"/>
    </mappers>
</configuration>

结果问题出现在了mapper配置中,mapper标签下所放的sql映射文件路径出现错误

正确的路径为

<mapper resource="com.bjpowernode.dao.StudentDao.xml"/>

错误修改后即可运行正常。
在这里插入图片描述

### MyBatis 连接数据库失败原因分析与解决方案 #### 一、常见错误及其解释 当遇到 `No operations allowed after connection closed` 的异常时,这通常意味着应用程序尝试在一个已经关闭的数据库连接上执行操作[^1]。此情况可能由多种因素引起: - **网络不稳定**:如果服务器端突然断开或者客户端长时间未活动导致超时,则可能导致现有会话被终止。 - **资源泄漏**:程序未能正确释放不再使用的Connection对象,在高并发场景下容易耗尽可用池中的所有链接实例。 对于 `GenericJDBCException: could not execute batch` 错误而言,它表明批量更新语句遇到了问题[^2]。具体来说可能是由于SQL语法不兼容、数据类型转换失败或者是违反了某些约束条件所造成的。 #### 二、配置检查要点 为了确保MyBatis可以顺利地同目标数据库建立联系并实施必要的查询动作,应当仔细核对以下几个方面[^3]: - **驱动类名**:确认在application.properties或对应的xml文件里指定了正确的JDBC Driver Class Name; - **URL格式**:验证url字符串是否遵循标准模式,并且包含了确切的目标主机地址以及端口号; - **认证凭证**:保证username和password字段填写无误,具有足够的权限来访问所需的schema/database; - **最大活跃数设置合理**:依据实际业务需求调整maxActive属性值,防止因过度占用而造成性能瓶颈甚至崩溃现象的发生; - **最小空闲数量适当**:minIdle参数决定了闲置状态下保持多少个连接处于就绪状态等待分配给线程使用,过低可能会频繁创建销毁带来额外负担; - **测试连接功能启用与否**:通过testOnBorrow/testWhileIdle选项开启检测机制可以在获取之前先检验其有效性从而减少意外状况发生的概率。 另外需要注意的是,Mapper XML 文件内的命名空间(namespace)要跟接口全限定名称完全一致,同时定义的方法签名也要严格匹配,包括但不限于返回值类型(resultType/resultMap),输入参数(parameterType)[^4]。 ```properties spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver spring.datasource.url=jdbc:mysql://localhost:3306/mydb?useSSL=false&serverTimezone=UTC spring.datasource.username=root spring.datasource.password=password spring.datasource.initialSize=5 spring.datasource.minIdle=5 spring.datasource.maxActive=20 spring.datasource.testOnBorrow=true ``` #### 三、排查思路总结 一旦发现上述提到的相关配置项均无明显失误但仍无法成功建连的话,建议按照如下顺序逐步深入探究根本所在: - 查看日志记录寻找更多线索; - 尝试简化环境排除干扰变量的影响(比如单独启动一个简单的Spring Boot项目仅用于测试DB Connectivity); - 利用命令行工具手动ping通远程host以判断是否存在物理层面障碍; - 更新至最新版本的依赖库避免已知Bug影响正常使用体验。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值