啥也不说,先上代码:
xml配置:
<?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>
<environments default="mysql_development">
<!-- 连接环境信息 -->
<environment id="mysql_development">
<!-- mysql使用什么事物管理方式 -->
<transactionManager type="JDBC">
<property name="" value="" />
</transactionManager>
<!-- mybatis使用连接池方式来获取连接对象 -->
<dataSource type="POOLED">
<!-- 配置数据库连接信息 -->
<property name="driver" value="com.mysql.jdbc.Driver" />
<property name="url" value="jdbc:mysql://your_mysql_url:3306/your_db_name?useUnicode=true&characterEncoding=utf-8" />
<property name="username" value="root" />
<property name="password" value="your_password" />
<property name="poolMaximumIdleConnections" value="0"/>
<property name="poolMaximumActiveConnections" value="1000"/>
<property name="poolPingQuery" value="SELECT 1 FROM DUAL" />
<property name="poolPingEnabled" value="true" />
</dataSource>
</environment>
</environments>
<mappers>
<package name="bean.map"/>
</mappers>
</configuration>
说明:上面都是很显然的,有几个地方注意
- url中
useUnicode=true&characterEncoding=utf-8
注意里面的转义字符&
也就是&,否则会出错的 - 后面两个参数
poolMaximumIdleConnections
,和poolMaximumActiveConnections
,需要并发控制的时候必须调整这俩参数 poolMaximumActiveConnections
是最大的活动连接数,活动连接,就是正在与数据库交互的连接,默认是10poolMaximumIdleConnections
是空闲连接数,就是没有处理请求的连接,默认是5- 具体可以参考mybatis的源码
org.apache.ibatis.datasource.pooled.PooledDataSource
.
注意:
PooledDataSource
就是连接池的实现类。可以看到里面定义了几个参数,其中就包括poolMaximumActiveConnections
和poolMaximumIdleConnections
,找到pushConnection
方法,这个方法里会判断当前空闲连接数和poolMaximumIdleConnections
的大小,如果小于poolMaximumIdleConnections
,会new PooledConnection并放进队列中,这就导致一个问题,当所有的连接被占满后,Mybatis为了保持一定的空闲连接,会不断获取新的连接,然后这些新连接被占用后,就会再去new PooledConnection,如果一直这样new下去,结果就会超过了mysql设置的最大连接数max_connections
,然后数据库返回错误:too many connections
。