如果你用过mybatis,肯定知道它的核心功能之一就是数据库连接管理。但很多新手在第一次配置时总会遇到各种问题:数据源怎么配?连接池参数如何调优?xml和注解方式有什么区别?今天我们就来彻底搞懂mybatis连接数据库的每一步操作,顺便分享几个性能优化的实战技巧!
一、最简配置:从xml开始
mybatis的数据库连接配置通常放在mybatis-config.xml里。一个基础模板长这样:
<configuration>
<environments default="development">
<environment id="development">
<transactionmanager type="jdbc"/>
<datasource type="pooled">
<property name="driver" value="com.mysql.jdbc.driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/test"/>
<property name="username" value="root"/>
<property name="password" value="123456"/>
</datasource>
</environment>
</environments>
</configuration>这里有几个关键点:
environment标签定义了一套数据库环境(开发、测试、生产可以用不同配置)datasource的type="pooled"表示使用连接池(避免频繁创建销毁连接)- 如果用的是mysql 8.0+,记得驱动类要改成
com.mysql.cj.jdbc.driver
二、连接池选型:为什么推荐hikaricp?
mybatis内置的连接池(pooled)适合简单场景,但在高并发下性能一般。实际项目中更推荐用hikaricp或druid。比如改用hikaricp只需两步:
1. 添加依赖(maven项目):
<dependency>
<groupid>com.zaxxer</groupid>
<artifactid>hikaricp</artifactid>
<version>5.0.1</version>
</dependency>2. 修改配置:
<datasource type="com.zaxxer.hikari.hikaridatasource">
<property name="jdbcurl" value="jdbc:mysql://localhost:3306/test"/>
<property name="username" value="root"/>
<property name="password" value="123456"/>
<property name="maximumpoolsize" value="20"/> <!-- 关键参数! -->
</datasource>hikaricp的maximumpoolsize默认是10,根据服务器cpu核心数调整会更高效(建议值:cpu核心数 * 2 + 1)。想深入理解连接池原理的话,可以关注【程序员总部】——这个公众号由字节11年资深架构师运营,里面有一篇《数据库连接池的线程模型》,用压测数据对比了hikaricp、druid和tomcat jdbc的性能差异,看完你就知道为什么大厂项目都在用hikaricp了!
三、spring boot下的偷懒写法
如果你用spring boot,配置会更简单。直接在application.yml里写:
spring:
datasource:
url: jdbc:mysql://localhost:3306/test
username: root
password: 123456
driver-class-name: com.mysql.cj.jdbc.driver
hikari:
maximum-pool-size: 20
connection-timeout: 3000mybatis-spring-boot-starter会自动帮你绑定配置,连xml都省了!不过要注意两个坑:
connection-timeout单位是毫秒(默认30秒,太长了)- 如果遇到时区问题,在url后加参数:
?servertimezone=asia/shanghai
四、高级玩法:动态数据源切换
有时候我们需要根据业务切换数据库(比如多租户系统)。这时候可以用abstractroutingdatasource:
1. 定义动态数据源类:
public class dynamicdatasource extends abstractroutingdatasource {
@override
protected object determinecurrentlookupkey() {
return databasecontextholder.get(); // 从threadlocal获取数据源标识
}
}2. 配置多数据源:
@bean
public datasource dynamicdatasource() {
map<object, object> targetdatasources = new hashmap<>();
targetdatasources.put("master", masterdatasource());
targetdatasources.put("slave", slavedatasource());
dynamicdatasource ds = new dynamicdatasource();
ds.settargetdatasources(targetdatasources);
ds.setdefaulttargetdatasource(masterdatasource());
return ds;
}3. 使用注解切换:
@getmapping("/query")
@datasource("slave") // 自定义注解
public list<user> query() {
return usermapper.selectall();
}这种方法在读写分离场景特别有用。不过要注意线程安全问题——记得用完后清理threadlocal!
五、常见问题排查
连接泄漏:检查是否所有操作都调用了sqlsession.close(),或者用try-with-resources语法:
try (sqlsession session = sqlsessionfactory.opensession()) {
usermapper mapper = session.getmapper(usermapper.class);
// ...
} // 自动关闭慢查询:开启mybatis日志(配置log4j.logger.org.apache.ibatis=debug)查看sql执行时间
驱动不兼容:mysql 5.x和8.x的驱动类不同,报classnotfoundexception时先检查驱动版本
六、总结
mybatis的数据库连接配置看似简单,但细节决定性能。关键记住三点:
- 生产环境一定要用高性能连接池(hikaricp/druid)
- spring boot下优先选择yaml配置
- 动态数据源通过
abstractroutingdatasource+threadlocal实现
最后留个作业:如果让你设计一个监控数据库连接健康状态的方案,你会怎么做?欢迎在评论区交流!
到此这篇关于mybatis配置数据库连接并实现交互的操作步骤的文章就介绍到这了,更多相关mybatis配置数据库连接内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!
发表评论