mybatis数据库连接池

mybatis作为一个ORM框架,在进行数据库操作时需要和数据库连接池连接,支持基于数据库连接池的连接创建方式。

目录

1.使用自带连接池

2.使用第三方数据库连接池

2.1添加依赖

2.2在utils文件夹下创建Druid数据源工厂类,该类必须继承UnpooledDataSourceFactory这个类因为连接池的不同,Druid需要重写父类的getDataSource()方法,在这个方法中需要将原始的dataSource强转成DruidDataSource,并执行init()方法

2.3.修改mybatis_config.xml数据源


1.使用自带连接池

在部署mybatis框架,进行数据库配置时,在mybatis_config.xml文件将数据源type设置为POOLED

 <!--3、环境-->
    <environments default="development">
        <!--   开发环境-->
        <environment id="development">
            <!-- 事务管理-->
            <transactionManager type="JDBC"/>
            <dataSource type="POOLED">
                <property name="driver" value="${jdbc.driver}"/>
                <property name="url" value="${jdbc.url}"/>
                <property name="username" value="${jdbc.username}"/>
                <property name="password" value="${jdbc.password}"/>
            </dataSource>
        </environment>
    </environments>

2.使用第三方数据库连接池

2.1添加依赖

<!-- https://mvnrepository.com/artifact/com.alibaba/druid -->
<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>druid</artifactId>
    <version>1.2.9</version>
</dependency>

2.2在utils文件夹下创建Druid数据源工厂类,该类必须继承UnpooledDataSourceFactory这个类
因为连接池的不同,Druid需要重写父类的getDataSource()方法,在这个方法中需要将原始的dataSource强转成DruidDataSource,并执行init()方法

package utils;

import com.alibaba.druid.pool.DruidDataSource;
import org.apache.ibatis.datasource.unpooled.UnpooledDataSourceFactory;

import javax.sql.DataSource;
import java.sql.SQLException;

public class DuridDataSourceFactory extends UnpooledDataSourceFactory {
    public DuridDataSourceFactory(){
        this.dataSource = new DruidDataSource();
    }

    @Override
    public DataSource getDataSource() {
        try {
            ((DruidDataSource)this.dataSource).init(); //初始化Druid数据源
        } catch (SQLException e) {
            throw new RuntimeException(e);
        }
        return this.dataSource;
    }
}

2.3.修改mybatis_config.xml数据源

    <!--3、环境 使用哪个数据源-->
    <environments default="druid">
        <environment id="druid">
            <transactionManager type="jdbc"/>
            <!--            配置druid数据连接池-->
            <dataSource type="包名.DuridDataSourceFactory">
                <property name="jdbcUrl" value="${jdbc.url}"/>
                <property name="driverClass" value="${jdbc.driver}"/>
                <property name="username" value="${jdbc.username}"/>
                <property name="password" value="${jdbc.password}"/>
                <!-- 初始连接数,默认为0 -->
                <property name="initialSize" value="10"/>
                <!-- 最大连接数,默认为8 -->
                <property name="maxActive" value="30"/>
                <!-- 最小闲置数 -->
                <property name="minIdle" value="10"/>
                <!-- 获取连接的最大等待时间,单位为毫秒 -->
                <property name="maxWait" value="60000"/>
                <!-- 缓存PreparedStatement,默认为false
                <property name="poolPreparedStatements" value="true"/>-->
                <!-- 缓存PreparedStatement的最大数量,默认-1(不缓存)。大于0时会自动开启缓存PreparedStatement,所以可以省略上一句设置 -->
                <property name="maxOpenPreparedStatements" value="20"/>
            </dataSource>
        </environment>
    </environments>

druid可配置字段:

配置缺省值说明
name配置这个属性的意义在于,如果存在多个数据源,监控的时候可以通过名字来区分开来。
如果没有配置,将会生成一个名字,格式是:"DataSource-" + System.identityHashCode(this)
jdbcUrl连接数据库的url,不同数据库不一样。例如:
mysql : jdbc:mysql://192.168.0.1:3306/druid2 
oracle : jdbc:oracle:thin:@192.168.0.1:1521:ocnauto
username连接数据库的用户名
password连接数据库的密码。如果你不希望密码直接写在配置文件中,可以使用ConfigFilter。详细看这里:使用ConfigFilter · alibaba/druid Wiki · GitHub
driverClassName根据url自动识别这一项可配可不配,如果不配置druid会根据url自动识别dbType,然后选择相应的driverClassName
initialSize0初始化时建立物理连接的个数。初始化发生在显示调用init方法,或者第一次getConnection时
maxActive8最大连接池数量
maxIdle8已经不再使用,配置了也没效果
minIdle最小连接池数量
maxWait获取连接时最大等待时间,单位毫秒。配置了maxWait之后,缺省启用公平锁,并发效率会有所下降,如果需要可以通过配置useUnfairLock属性为true使用非公平锁。
poolPreparedStatementsfalse是否缓存preparedStatement,也就是PSCache。PSCache对支持游标的数据库性能提升巨大,比如说oracle。在mysql下建议关闭。
maxOpenPreparedStatements-1要启用PSCache,必须配置大于0,当大于0时,poolPreparedStatements自动触发修改为true。在Druid中,不会存在Oracle下PSCache占用内存过多的问题,可以把这个数值配置大一些,比如说100
validationQuery用来检测连接是否有效的sql,要求是一个查询语句。如果validationQuery为null,testOnBorrow、testOnReturn、testWhileIdle都不会其作用。
testOnBorrowtrue申请连接时执行validationQuery检测连接是否有效,做了这个配置会降低性能。
testOnReturnfalse归还连接时执行validationQuery检测连接是否有效,做了这个配置会降低性能
testWhileIdlefalse建议配置为true,不影响性能,并且保证安全性。申请连接的时候检测,如果空闲时间大于timeBetweenEvictionRunsMillis,执行validationQuery检测连接是否有效。
timeBetweenEvictionRunsMillis有两个含义:
1) Destroy线程会检测连接的间隔时间 2) testWhileIdle的判断依据,详细看testWhileIdle属性的说明
numTestsPerEvictionRun不再使用,一个DruidDataSource只支持一个EvictionRun
minEvictableIdleTimeMillis
connectionInitSqls物理连接初始化的时候执行的sql
exceptionSorter根据dbType自动识别当数据库抛出一些不可恢复的异常时,抛弃连接
filters属性类型是字符串,通过别名的方式配置扩展插件,常用的插件有:
监控统计用的filter:stat 日志用的filter:log4j 防御sql注入的filter:wall
proxyFilters类型是List<com.alibaba.druid.filter.Filter>,如果同时配置了filters和proxyFilters,是组合关系,并非替换关系

  • 2
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
MyBatis是一个持久层框架,它并不直接提供数据库连接池的功能,而是依赖于其他的数据库连接池实现来管理数据库连接。 在MyBatis中,可以通过配置文件来指定使用的数据库连接池。常用的数据库连接池实现有: 1. Apache Commons DBCP:一个开源的数据库连接池实现,具有良好的性能和稳定性。 2. C3P0:另一个常用的开源数据库连接池实现,提供了更多的配置选项和监控功能。 3. HikariCP:一个高性能的数据库连接池实现,相对于DBCP和C3P0更为轻量级和快速。 你可以根据自己的需求选择适合的数据库连接池实现,并在MyBatis的配置文件中进行相关配置。一般情况下,你需要配置连接池的最大连接数、最小连接数、连接超时时间等参数。 例如,使用Apache Commons DBCP作为数据库连接池的示例配置如下: ```xml <dataSource type="org.apache.commons.dbcp2.BasicDataSource"> <property name="driverClassName" value="com.mysql.jdbc.Driver"/> <property name="url" value="jdbc:mysql://localhost:3306/mydatabase"/> <property name="username" value="root"/> <property name="password" value="mypassword"/> <property name="initialSize" value="5"/> <property name="maxTotal" value="20"/> <property name="maxIdle" value="10"/> <property name="maxWaitMillis" value="10000"/> </dataSource> ``` 这是一个简单的配置示例,你可以根据自己的实际情况进行调整。在配置文件中,还可以设置其他属性,如连接池的验证语句、连接池的空闲对象清理策略等。 需要注意的是,MyBatis只是使用数据库连接池来管理数据库连接,并不负责连接池的具体实现。因此,你需要在项目中引入相应的数据库连接池实现,并将其配置到MyBatis的配置文件中。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值