天天看點

MyBatis 外接 HikariCP 連接配接池 (無Spring)

嘗試MyBatis連接配接HikariCP連接配接池, 資料基本都來自于 MyBatis官網手冊以及 HikariCP Github頁面的readme.md教學檔案

筆者用的是MySql資料庫, 首先根據hikariCP的要求, 選擇适合的插入依賴

Java 8/9 maven artifact:

<dependency>
        <groupId>com.zaxxer</groupId>
        <artifactId>HikariCP</artifactId>
        <version>2.7.8</version>
    </dependency>
           

Java 7 maven artifact (*maintenance mode*):

<dependency>
        <groupId>com.zaxxer</groupId>
        <artifactId>HikariCP-java7</artifactId>
        <version>2.4.13</version>
    </dependency>
           

Java 6 maven artifact (*maintenance mode*):

<dependency>
        <groupId>com.zaxxer</groupId>
        <artifactId>HikariCP-java6</artifactId>
        <version>2.3.13</version>
    </dependency>
           

然後我們檢視官方文檔, 要求我們寫一個繼承

org.apache.ibatis.datasource.unpooled.UnpooledDataSourceFactory

的類

public class HikariCPDataSourceFactory extends UnpooledDataSourceFactory {
    public HikariCPDataSourceFactory() {
        this.dataSource = new HikariDataSource();
    }
}
           

HikariCP 的文檔要求我們配置properties, 這個我們不需要擔心, 在MyBatis中, 我們隻要和不引入外接資料源一樣, 配置MyBatis的資料庫連接配接檔案就可以了, 唯一變化的, 隻是配置檔案中的屬性, 是我們這個外接資料源的屬性即可. 建立

hikari.properties

(名稱不固定)在

rescourses

檔案夾下, 配置

jdbcUrl=jdbc:mysql://localhost:/mybatis?characterEncoding=utf-
username=root
password=admin
           

這裡隻配置了3個足夠的參數, 多餘的參數請查閱HikariCP 在 Github上的文檔. 這3個參數和我們正常配置的參數還不太一樣, 也和正常HikariCP的配置不同, 我們下面分條講述:

  1. 沒有配置

    driverClassName

  2. HikariCP已經引入了

    dataSourceClassName

    作為

    jdbcUrl

    的替代, 但是我們仍然配置了

    jdbcUrl

問題1: 官方文檔如下

driverClassName:

HikariCP will attempt to resolve a driver through the DriverManager based solely on the

jdbcUrl

,

but for some older drivers the

driverClassName

must also be specified. Omit this property unless

you get an obvious error message indicating that the driver was not found.

大意就是說, HikariCP會根據jdbcUrl這個屬性來幫我們找到 driver, 但是一些舊的driver并不能被找到, 報錯的時候我們再來手動添加這個屬性.

問題2: 官方文檔如下

dataSourceClassName:

We recommended using

dataSourceClassName

instead of

jdbcUrl

, but either is acceptable. We’ll say that again, either is acceptable.

Spring Boot auto-configuration users, you need to use

jdbcUrl

-based configuration.

The MySQL DataSource is known to be broken with respect to network timeout support. Use

jdbcUrl

configuration instead.

dataSourceClassName

這個屬性可以提供JDBC驅動, 并且是官方推薦我們使用這個屬性 替代使用

jdbcUrl

. 但是 MySQL 資料庫在網絡逾時的支援上有崩潰的可能, 是以我們使用MySQL資料庫時還是使用

jdbcUrl

, 另外, spring 自定義擴充 也要使用

jdbcUrl

這一個屬性

關于資料庫的dataSourceClassName, 各個資料庫的值也是固定的, 也請翻閱hikariCP的官方文檔.

接下來我們配置MyBatis的

SqlMapConfig.xml

, 加入

然後配置

dataSource

<dataSource type="com.itheima.utils.HikariCPDataSourceFactory" >
        <property name="jdbcUrl" value="${jdbcUrl}" />
        <property name="username" value="${username}" />
        <property name="password" value="${password}" />
</dataSource>
           

這裡的

name

以及

${}

需要和我們在

hikari.properties

中設定的屬性一緻, 配置完成我們利用jUnit和Log日志進行測試,

項目建構以及資料庫

user

表如下:

MyBatis 外接 HikariCP 連接配接池 (無Spring)
MyBatis 外接 HikariCP 連接配接池 (無Spring)
<!-- UserMapper.xml 配置 -->
<mapper namespace="com.itheima.builder.UserMapper">
  <select id="getUserById" resultType="user"  parameterType="int">
    select * from user where id = #{id}
  </select>
</mapper>
           
public class Demo01 {
    private SqlSession sqlSession;

    @Before
    public void init() throws IOException {
        SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
        SqlSessionFactory factory = builder.build(Resources.getResourceAsStream("SqlMapConfig.xml"));
        sqlSession = factory.openSession();
    }

    @Test
    public void selectUserById2() throws IOException {
        UserMapper mapper = sqlSession.getMapper(UserMapper.class);
        User user = mapper.getUserById();
        System.out.println(user);
    }

    @After
    public void close() {
        sqlSession.close();
    }
}
           

輸出(一部分):

MyBatis 外接 HikariCP 連接配接池 (無Spring)

已經查找到了我們存放的資料, 并且還看到了

dataSource

的屬性