mybatis整合hikariCP(非spring)mysql
1、配置hikariCP
典型的配置文件hikariPool.propertiesspring
jdbcUrl=jdbc:mysql://localhost:3306/omc?characterEncoding=utf8&serverTimezone=UTC dataSource.user=remote dataSource.password=xxxxxx dataSource.cachePrepStmts=true dataSource.prepStmtCacheSize=250 dataSource.prepStmtCacheSqlLimit=2048 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=30000 # 一个链接idle状态的最大时长(毫秒),超时则被释放(retired),缺省:10分钟 --> dataSource.idleTimeout=600000 # 一个链接的生命时长(毫秒),超时并且没被使用则被释放(retired),缺省:30分钟 # 建议设置比数据库超时时长少30秒,参考MySQL wait_timeout参数(show variables like '%timeout%';) dataSource.maxLifetime=1800000 # 链接池中容许的最大链接数。缺省值:10;推荐的公式:((core_count * 2) + effective_spindle_count) # core_count CPU的内核数量 # effective_spindle_count is the number of disks in a RAID.就是磁盘列阵中的硬盘数 dataSource.maximumPoolSize=10
2、hikariCP绑定mybatis并初始化sql
public class HikariDataSourceFactory extends UnpooledDataSourceFactory { public HikariDataSourceFactory(){ HikariConfig config = new HikariConfig("hikariPool.properties"); config.setMaximumPoolSize(5); this.dataSource = new HikariDataSource(config); } }
这个UnpooledDataSourceFactory类就是Mybatis提供的用于第三方链接池覆盖DataSource的入口。数据库
3、mybatis配置
典型的配置文件sqlMapConf.xmlmybatis
<?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>
4、mybatis整合并初始化app
String resource = "sqlMapConfig.xml";ide
InputStream inputStream = null; try { inputStream = Resources.getResourceAsStream(resource); } catch (IOException e) { e.printStackTrace(); } SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream); ......
5、关于SqlSessionFactory的变量范围
SqlSessionFactory 一旦被建立就应该在应用的运行期间一直存在,没有任何理由对它进行清除或重建。
使用 SqlSessionFactory 的最佳实践是在应用运行期间不要重复建立屡次,屡次重建 SqlSessionFactory 被视为一种代码“坏味道(bad smell)”。
所以 SqlSessionFactory 的最佳做用域是应用做用域。有不少方法能够作到,最简单的就是使用单例模式或者静态单例模式。ui