mybatis整合hikariCP(非spring)
一、配置hikariCP
典型的配置文件hikariPool.properties
jdbcUrl=jdbc:mysql://localhost:3306/omc?characterEncoding=utf8&serverTimezone=UTC
dataSource.user=remote
dataSource.password=xxxxxx
dataSource.cachePrepStmts=true
dataSource.prepStmtCacheSize=
dataSource.prepStmtCacheSqlLimit=
dataSource.useServerPrepStmts=true
dataSource.useLocalSessionState=true
dataSource.rewriteBatchedStatements=true
dataSource.cacheResultSetMetadata=true
dataSource.cacheServerConfiguration=true
dataSource.elideSetAutoCommits=true
dataSource.maintainTimeStats=false
# 等待连接池分配连接的最大时长(毫秒),超过这个时长还没可用的连接则发生SQLException, 缺省:30秒
dataSource.connectionTimeout=
# 一个连接idle状态的最大时长(毫秒),超时则被释放(retired),缺省:10分钟 -->
dataSource.idleTimeout=
# 一个连接的生命时长(毫秒),超时而且没被使用则被释放(retired),缺省:30分钟
# 建议设置比数据库超时时长少30秒,参考MySQL wait_timeout参数(show variables like '%timeout%';)
dataSource.maxLifetime=
# 连接池中允许的最大连接数。缺省值:;推荐的公式:((core_count * ) + effective_spindle_count)
# core_count CPU的内核数量
# effective_spindle_count is the number of disks in a RAID.就是磁盘列阵中的硬盘数
dataSource.maximumPoolSize=
二、hikariCP绑定mybatis并初始化
public class HikariDataSourceFactory extends
UnpooledDataSourceFactory {
public HikariDataSourceFactory(){
HikariConfig config = new HikariConfig("hikariPool.properties");
config.setMaximumPoolSize();
this.dataSource = new HikariDataSource(config);
}
}
这个UnpooledDataSourceFactory类就是Mybatis提供的用于第三方连接池覆盖DataSource的入口。
三、mybatis配置
典型的配置文件sqlMapConf.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="com.tool.db.pool.HikariDataSourceFactory"/> <!-- 步骤2的类的路径 -->
</environment>
</environments>
<mappers>
<package name="com.tool.db.builder"/> <!-- 各种xml映射文件的包路径 -->
</mappers>
</configuration>
四、mybatis整合并初始化
String resource = "sqlMapConfig.xml";
InputStream inputStream = null;
try {
inputStream = Resources.getResourceAsStream(resource);
} catch (IOException e) {
e.printStackTrace();
}
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
......
五、关于SqlSessionFactory的变量范围
SqlSessionFactory 一旦被创建就应该在应用的运行期间一直存在,没有任何理由对它进行清除或重建。
使用 SqlSessionFactory 的最佳实践是在应用运行期间不要重复创建多次,多次重建 SqlSessionFactory 被视为一种代码“坏味道(bad smell)”。
因此 SqlSessionFactory 的最佳作用域是应用作用域。有很多方法可以做到,最简单的就是使用单例模式或者静态单例模式。