MyBatis:自定义连接池


#Java Mybatis#


本节示例代码在 mybatis-demo-002

1. mybatis 内置连接池

在上一节中 MyBatis 的配置文件mybatis-config.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="development">
        <environment id="development">
            <transactionManager type="JDBC"/>
            <dataSource type="POOLED">
                <property name="driver" value="com.mysql.jdbc.Driver"/>
                <property name="url" value="jdbc:mysql://127.0.0.1:3306/blog_db?useUnicode=true&amp;characterEncoding=utf8"/>
                <property name="username" value="root"/>
                <property name="password" value="123456"/>
            </dataSource>
        </environment>
    </environments>
    <mappers>
        <mapper resource="mapper/UserMapper.xml"/>
    </mappers>
</configuration>

其中<dataSource>用来配置数据库连接,它指定了type为POOLED,意思是将数据库连接放进「池子」里,也就是连接池。若type设置成UNPOOLED,则不使用连接池。各种服务中一般建议使用连接池,它可以帮助我们管理连接,通过资源重用以节省开销。

对于 mybatis 的连接池,除了配置数据库地址、用户名、密码,还有更多可以配置,例如配置成:

<dataSource type="POOLED">
    <property name="driver" value="com.mysql.jdbc.Driver"/>
    <property name="url" value="jdbc:mysql://127.0.0.1:3306/blog_db?useUnicode=true&amp;characterEncoding=utf8"/>
    <property name="username" value="root"/>
    <property name="password" value="123456"/>

    <property name="poolMaximumActiveConnections" value="10" />
    <property name="poolTimeToWait" value="5000" />
    <property name="poolPingEnabled" value="true"/>
    <property name="poolPingQuery" value="select 1 from user" />
</dataSource>

这些属性的介绍,可以在 http://www.mybatis.org/mybatis-3/zh/configuration.html 找到。

2. 自定义连接池

POOLED 用的是mybatis自己实现的连接池。我们也可以自定义连接池。

比如我们用 DBCP 连接池。

第1步:

首先在 build.gradle 中增加依赖:

compile group: 'org.apache.commons', name: 'commons-dbcp2', version: '2.5.0'

第2步:

编写实现org.apache.ibatis.datasource.DataSourceFactory接口的类:

package datasource;

import lombok.Data;
import org.apache.commons.dbcp2.BasicDataSource;
import org.apache.ibatis.datasource.DataSourceFactory;

import javax.sql.DataSource;
import java.util.Properties;

@Data
public class DBCPDataSourceFactory implements DataSourceFactory {

    private String username;
    private String password;
    private String driver;
    private String url;
    private int initialSize = 6;
    private int maxIdle = 8;
    private int minIdle = 6;

    @Override
    public void setProperties(Properties props) {
        username = props.getProperty("username");
        password = props.getProperty("password");
        driver = props.getProperty("driver");
        url = props.getProperty("url");

        initialSize = Integer.valueOf(props.getProperty("initialSize", ""+initialSize));
        maxIdle = Integer.valueOf(props.getProperty("maxIdle", ""+maxIdle));
        minIdle = Integer.valueOf(props.getProperty("minIdle", ""+minIdle));
    }

    @Override
    public DataSource getDataSource() {
        BasicDataSource dataSource = new BasicDataSource();
        dataSource.setUsername(username);
        dataSource.setPassword(password);
        dataSource.setUrl(url);
        dataSource.setDriverClassName(driver);
        dataSource.setInitialSize(initialSize);
        dataSource.setMaxIdle(maxIdle);
        dataSource.setMinIdle(minIdle);
        return dataSource;
    }

}

我们声明了 username、password、driver、url、initialSize、maxIdle、minIdle 7个属性。这些属性可以在 mybatis 配置文件中配置。见下一步。

第3步:

在 resources 目录新增 mybatis 配置文件 mybatis-config-dbcp.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="development">
        <environment id="development">
            <transactionManager type="JDBC"/>
            <dataSource type="datasource.DBCPDataSourceFactory">
                <property name="driver" value="com.mysql.jdbc.Driver"/>
                <property name="url" value="jdbc:mysql://127.0.0.1:3306/blog_db?useUnicode=true&amp;characterEncoding=utf8"/>
                <property name="username" value="root"/>
                <property name="password" value="123456"/>
                <property name="maxIdle" value="20"/>
            </dataSource>
        </environment>
    </environments>
    <mappers>
        <mapper resource="mapper/UserMapper.xml"/>
    </mappers>
</configuration>

注意,<dataSource> 的 type 属性值是上面定义的 DBCPDataSourceFactory 类的全路径。几个<property>标签中的 name值 和 DBCPDataSourceFactory 中的字段是一致的。

第4步:

在 Main 类中编写业务代码:

@Test
public void test_02() throws IOException {
    SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();
    SqlSessionFactory sessionFactory;
    sessionFactory = sqlSessionFactoryBuilder.build(
            Resources.getResourceAsReader("mybatis-config-dbcp.xml"),
            "development"
    );
    SqlSession sqlSession = sessionFactory.openSession();

    try {
        UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
        User user = userMapper.findById(1L);
        log.info("{}", user);
    } finally {
        sqlSession.close();
    }
}

执行结果:

 INFO [main] - User(id=1, name=letian, email=letian@111.com, password=123)

符合预期!😆


( 本文完 )