使用Mybatis时请注意这两个参数,否则会让你的数据库连接爆掉

     上次发帖是在跳槽后,今天为止已经在新公司工作了两个星期了,感受什么的,我另外写文章再谈,言归正传,讲正事~~!
     目前正在开发一个产品的服务器端代码,持久层我选择了Mybatis3(也就是原来的ibatis)作为框架,之所以选择他理由就是我觉得Hibernate搞起来貌似很复杂,我不太会用,哈哈(上家公司留下的阴影,用Hibernate搞得我想死)。上周完成了大部分代码的开发工作,想着既然是要发布的产品,于是找来Jmeter做压力测试,结果这一测,暴露问题了,mysql返回" too many connections"这个error,这个error的具体解释参照这个链接 http://dev.mysql.com/doc//refman/5.5/en/too-many-connections.html
     一般持久层与数据库连接都会通过一个连接池(pooled datasource)管理,方便复用连接,控制并发,比较有名的有DBCP,C3P0,BONECP等等。Mybatis3自己实现了一个连接池,在配置文件中指定datasource的type属性为POOLED即可使用。与并发关系较大的两个Mybatis连接池参数是 poolMaximumActiveConnectionspoolMaximumIdleConnections
      好了,出了问题,自然得找文档(官方手册,中英文皆有),poolMaximumActiveConnections是最大的活动连接数,活动连接,顾名思义,就是正在与数据库交互的连接,默认是10,poolMaximumIdleConnections是空闲连接数,就是没有处理请求的连接,默认是5。Mysql的max_connections我设置的是200,既最大连接数。这样一看,好像找不到问题所在,连接池最大的活动连接也就是10,跟200比还差很远,Mysql怎么会返回"too many connections"呢?在查阅文档无果后,我请教周围的一位同事,他虽然没用过Mybatis,但是他说是不是请求数超过poolMaximumActiveConnections后mybatis还会去获取连接,是不是有这样的参数控制,然后让我看看源码,说开源的东西嘛,搞不清楚就看源码。
      我一向对源码抱有恐惧的心理,感觉那都是大神写的,我等屌丝怎能看得懂,不过被逼无奈,翻出Mybatis的源码看了一看,结果豁然开朗。找到org.apache.ibatis.datasource.pooled包下面的PooledDataSource类,这个就是连接池的实现类。可以看到里面定义了几个参数,其中就包括poolMaximumActiveConnections和poolMaximumIdleConnections,找到pushConnection方法,这个方法里会判断当前空闲连接数和poolMaximumIdleConnections的大小,如果小于他,会new PooledConnection并放进队列中,这就导致一个问题,当所有的连接被占满后,Mybatis为了保持一定的空闲连接,会不断获取新的连接,然后这些新连接被占用后,就会再去new PooledConnection,结果就是超过了mysql设置的最大连接数,然后数据库返回该错误。不知道这算不算是Mybatis的一个"坑"吧,总之在使用时要小心了,并发量大的时候就会爆掉你的数据库,解决办法很简单,将poolMaximumIdleConnections设置为0即可,果然改掉后压力测试不会爆掉数据库。
       现在回想起来,官方文档对poolMaximumIdleConnections的定义是: 在任意时间存在的空闲连接数,完全就解释了这个参数的含义,只不过当时没有仔细想,那这个参数是不是该改名字叫poolPermanentIdleConnections比较好呢,呵呵。
问题解决了,很开心,晚上回去再仔细读下里面的源码,看看还有没有别的没发现的问题。看来源码也不是想象中的那么神秘和高深啊。其实为什么那个同事一下就能看出问题的大概,一方面是经验丰富,另一方面可能与他理解数据库连接池机制有关,归根到底,基础的东西还是最重要的
<think>我们正在讨论如何在SpringBoot项目中配置和使用MyBatis进行数据库操作。根据引用内容,我们可以整理出以下步骤:1.**添加依赖**:在项目的`pom.xml`文件中添加MyBatis数据库驱动的依赖。2.**配置数据源**:在`application.properties`或`application.yml`中配置数据库连接信息。3.**创建Mapper接口**:使用MyBatis的注解或XML文件编写SQL映射。4.**扫描Mapper接口**:在SpringBoot主应用类上使用`@MapperScan`注解指定Mapper接口所在的包。5.**使用Mapper**:在Service或Controller中注入Mapper接口并调用其方法。下面详细说明每个步骤:###1.添加依赖在`pom.xml`中添加以下依赖(以MySQL为例):```xml<dependencies><!--SpringBootWebStarter(如果项目是Web项目)--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><!--MyBatisSpringBootStarter--><dependency><groupId>org.mybatis.spring.boot</groupId><artifactId>mybatis-spring-boot-starter</artifactId><version>3.0.3</version><!--请使用最新版本--></dependency><!--MySQL驱动--><dependency><groupId>com.mysql</groupId><artifactId>mysql-connector-j</artifactId><version>8.0.33</version><!--请根据你的MySQL版本选择--></dependency></dependencies>```###2.配置数据源在`src/main/resources/application.properties`文件中配置数据库连接信息:```properties#数据库连接配置spring.datasource.url=jdbc:mysql://localhost:3306/your_database?useSSL=false&serverTimezone=UTCspring.datasource.username=rootspring.datasource.password=your_passwordspring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver#MyBatis配置(可选)#指定MapperXML文件的位置,如果没有XML文件可以不用配置mybatis.mapper-locations=classpath:mapper/*.xml#配置MyBatis的别名扫描包mybatis.type-aliases-package=com.example.demo.entity```###3.创建Mapper接口和SQL映射有两种方式:使用注解或XML文件。**使用注解方式**:在Mapper接口的方法上直接使用SQL注解(如`@Select`):```javapackagecom.example.demo.mapper;importcom.example.demo.entity.User;importorg.apache.ibatis.annotations.Mapper;importorg.apache.ibatis.annotations.Select;@Mapper//这里可以单独标注,也可以在启动类上统一扫描publicinterfaceUserMapper{@Select("SELECT*FROMuserWHEREid=#{id}")UsergetUserById(Integerid);}```**使用XML文件方式**:在`src/main/resources/mapper`目录下创建对应的XML文件(例如`UserMapper.xml`):```xml<?xmlversion="1.0"encoding="UTF-8"?><!DOCTYPEmapperPUBLIC"-//mybatis.org//DTDMapper3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd"><mappernamespace="com.example.demo.mapper.UserMapper"><selectid="getUserById"resultType="com.example.demo.entity.User">SELECT*FROMuserWHEREid=#{id}</select></mapper>```###4.扫描Mapper接口在SpringBoot的主应用类上添加`@MapperScan`注解,指定Mapper接口所在的包:```javapackagecom.example.demo;importorg.mybatis.spring.annotation.MapperScan;importorg.springframework.boot.SpringApplication;importorg.springframework.boot.autoconfigure.SpringBootApplication;@SpringBootApplication@MapperScan("com.example.demo.mapper")//指定Mapper接口的包路径publicclassDemoApplication{publicstaticvoidmain(String[]args){SpringApplication.run(DemoApplication.class,args);}}```###5.使用Mapper在Service中注入Mapper并调用其方法:```javapackagecom.example.demo.service;importcom.example.demo.mapper.UserMapper;importcom.example.demo.entity.User;importorg.springframework.beans.factory.annotation.Autowired;importorg.springframework.stereotype.Service;@ServicepublicclassUserService{privatefinalUserMapperuserMapper;@AutowiredpublicUserService(UserMapperuserMapper){this.userMapper=userMapper;}publicUsergetUserById(Integerid){returnuserMapper.getUserById(id);}}```然后在Controller中调用Service即可。###注意事项-如果使用XML方式,确保`application.properties`中配置了`mybatis.mapper-locations`指向正确的XML文件位置。-实体类(如`User`)应该放在`mybatis.type-aliases-package`指定的包下,这样在XML中就可以使用简单类名(如`resultType="User"`),但注意在XML中最好还是使用全限定名以避免冲突。-如果遇到问题,检查依赖版本是否兼容,以及数据库连接信息是否正确。通过以上步骤,就可以在SpringBoot项目中成功集成MyBatis进行数据库操作了[^1][^2][^3]。§§相关问题§§1.SpringBoot集成MyBatis如何配置多数据源?2.MyBatis在SpringBoot中如何使用事务管理?3.如何在SpringBoot中使用MyBatis-Plus来简化操作?</think>### 在Spring Boot中配置和使用MyBatis的步骤 #### 1. **添加依赖** 在`pom.xml`中引入核心依赖: ```xml <dependencies> <!-- Spring Boot Web Starter --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <!-- MyBatis整合Spring Boot --> <dependency> <groupId>org.mybatis.spring.boot</groupId> <artifactId>mybatis-spring-boot-starter</artifactId> <version>3.0.3</version> </dependency> <!-- MySQL驱动 --> <dependency> <groupId>com.mysql</groupId> <artifactId>mysql-connector-j</artifactId> <version>8.0.33</version> </dependency> </dependencies> ``` #### 2. **配置数据源** 在`application.properties`中配置数据库连接: ```properties # 数据库连接 spring.datasource.url=jdbc:mysql://localhost:3306/your_db?useSSL=false&serverTimezone=UTC spring.datasource.username=root spring.datasource.password=your_password spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver # MyBatis配置 mybatis.mapper-locations=classpath:mapper/*.xml # XML映射文件位置 mybatis.type-aliases-package=com.example.demo.entity # 实体类包路径 ``` #### 3. **创建实体类和Mapper接口** 实体类示例: ```java package com.example.demo.entity; public class User { private Long id; private String name; // getters/setters } ``` Mapper接口(使用注解或XML): ```java package com.example.demo.mapper; @Mapper // 声明为MyBatis接口 public interface UserMapper { @Select("SELECT * FROM user WHERE id = #{id}") User getUserById(Long id); } ``` #### 4. **配置Mapper扫描** 在启动类添加`@MapperScan`: ```java package com.example.demo; @SpringBootApplication @MapperScan("com.example.demo.mapper") // 扫描Mapper接口包 public class DemoApplication { public static void main(String[] args) { SpringApplication.run(DemoApplication.class, args); } } ``` #### 5. **使用Mapper操作数据库** 在Service中注入Mapper: ```java @Service public class UserService { @Autowired private UserMapper userMapper; public User getUser(Long id) { return userMapper.getUserById(id); } } ``` #### 6. **XML映射文件(可选)** 在`resources/mapper/UserMapper.xml`中: ```xml <mapper namespace="com.example.demo.mapper.UserMapper"> <select id="getUserById" resultType="User"> SELECT * FROM user WHERE id = #{id} </select> </mapper> ``` ### 关键说明 1. **依赖选择**:`mybatis-spring-boot-starter`自动配置了SqlSessionFactory和事务管理[^1]。 2. **注解 vs XML**: - 简单SQL用注解(如`@Select`) - 复杂SQL(动态SQL/关联查询)推荐XML 3. **事务控制**:Spring Boot默认启用声明式事务,在Service方法添加`@Transactional`即可[^3]。 ### 验证是否生效 1. 启动应用,检查日志是否出现`Initialized MyBatis mapper interfaces` 2. 调用Service方法测试数据库查询 > 提示:若使用MySQL 8.x,确保驱动类名为`com.mysql.cj.jdbc.Driver`,并在URL中指定区(如`serverTimezone=UTC`)[^3]。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值