mybatis中的环境配置指的就是environments标签内的配置,如下:
注意这里的关键点:
默认使用的环境 ID(比如:"development")。
每个 environment 元素需要定义环境 ID(比如:id="development" 等)。
事务管理器的配置(比如:type="JDBC")。
数据源的配置(比如:type="POOLED")。
多环境配置
配置中,外面是environments标签,里面是environment标签,从结构上可以看出,MyBatis 支持配置多个环境,这种机制有助于将 SQL 语句的映射文件应用于多个数据库之中, 现实情况下有很多开发场景需要这么做。例如,开发、测试和生产环境需要有不同的数据库配置;或者想在具有相同 Schema 的多个生产数据库中 使用相同的 SQL 映射文件等等。
不过要记住:尽管可以配置多个环境,但每个 SqlSessionFactory 实例只能选择一种环境。
所以,如果你想连接两个数据库,就需要创建两个 SqlSessionFactory 实例,每个数据库对应一个。而如果是三个数据库,就需要三个实例,依此类推。我们来增加一个环境:
环境id也换成了我们熟悉的test和prod。这时候再创建sqlSessionFactory就需要把环境id传过去:
我们把环境参数提取出来,可以很方便的在多环境之间切换:
如果不写环境id,那么默认的环境id:development会被加载。
事务管理器
transactionManager标签用来配置事务。在 MyBatis 中有两种类型的事务管理器,入门例子中写的是type="JDBC",还有一种是type="MANAGED"。
JDBC – 这个配置就是直接使用了 JDBC 的提交和回滚设置,它依赖于从数据源得到的连接来管理事务作用域。
MANAGED – 这个配置几乎没做什么。它从来不提交或回滚一个连接,而是让容器来管理事务的整个生命周期(比如 JEE 应用服务器的上下文)。 默认情况下它会关闭连接,然而一些容器并不希望这样,因此需要将 closeConnection 属性设置为 false 来阻止它默认的关闭行为。例如:
提示:如果你正在使用 Spring + MyBatis,则没有必要配置事务管理器, 因为 Spring 模块会使用自带的管理器来覆盖前面的配置。
使用下列方式获取sqlSession,默认是关闭自动提交的,需要手动提交:
sqlSessionFactory.openSession()
如果想默认开启自动提交,需要添加一个参数:
sqlSessionFactory.openSession(true)
数据源(dataSource)配置
dataSource标签内是数据源配置,内容是连接数据库的参数。dataSource 元素使用标准的 JDBC 数据源接口来配置 JDBC 连接对象的资源。入门例子中数据源的类型是type="POOLED",mybatis共有三种内建的数据源类型(也就是 type=”[UNPOOLED|POOLED|JNDI]”):
UNPOOLED– 这个数据源的实现只是每次被请求时打开和关闭连接。虽然有点慢,但对于在数据库连接可用性方面没有太高要求的简单应用程序来说,是一个很好的选择。 不同的数据库在性能方面的表现也是不一样的,对于某些数据库来说,使用连接池并不重要,这个配置就很适合这种情形。
POOLED– 这种数据源的实现利用“连接池”的概念将 JDBC 连接对象组织起来,避免了创建新的连接实例时所必需的初始化和认证时间。 这是一种使得并发 Web 应用快速响应请求的流行处理方式。
JNDI – 这个数据源的实现是为了能在如 EJB 或应用服务器这类容器中使用,容器可以集中或在外部配置数据源,然后放置一个 JNDI 上下文的引用。
其中UNPOOLED和JNDI 不再细说。使用线程池的POOLED除了驱动,连接,用户名和密码四个参数外,还有很多属性用来配置 POOLED 的数据源:
defaultTransactionIsolationLevel – 默认的连接事务隔离级别。
poolMaximumActiveConnections – 在任意时间可以存在的活动(也就是正在使用)连接数量,默认值:10
poolMaximumIdleConnections – 任意时间可能存在的空闲连接数。
poolMaximumCheckoutTime – 在被强制返回之前,池中连接被检出(checked out)时间,默认值:20000 毫秒(即 20 秒)
poolTimeToWait – 这是一个底层设置,如果获取连接花费了相当长的时间,连接池会打印状态日志并重新尝试获取一个连接(避免在误配置的情况下一直安静的失败),默认值:20000 毫秒(即 20 秒)。
poolMaximumLocalBadConnectionTolerance – 这是一个关于坏连接容忍度的底层设置, 作用于每一个尝试从缓存池获取连接的线程。 如果这个线程获取到的是一个坏的连接,那么这个数据源允许这个线程尝试重新获取一个新的连接,但是这个重新尝试的次数不应该超过 poolMaximumIdleConnections 与 poolMaximumLocalBadConnectionTolerance 之和。 默认值:3 (新增于 3.4.5版本)
poolPingQuery – 发送到数据库的侦测查询,用来检验连接是否正常工作并准备接受请求。默认是“NO PING QUERY SET”,这会导致多数数据库驱动失败时带有一个恰当的错误消息。
poolPingEnabled – 是否启用侦测查询。若开启,需要设置 poolPingQuery 属性为一个可执行的 SQL 语句(最好是一个速度非常快的 SQL 语句),默认值:false。
poolPingConnectionsNotUsedFor – 配置 poolPingQuery 的频率。可以被设置为和数据库连接超时时间一样,来避免不必要的侦测,默认值:0(即所有连接每一时刻都被侦测 — 当然仅当 poolPingEnabled 为 true 时适用)。
除了默认的连接池,还有很多开源的更加好用的连接池,下面来配置一下比较常用的c3p0和druid连接池。
c3p0连接池配置
C3P0是一个开源的JDBC连接池,它实现了数据源和JNDI绑定,支持JDBC3规范和JDBC2的标准扩展。目前使用它的开源项目有Hibernate,Spring等。Mybatis 没有帮开发者实现 c3p0 数据库连接池,故需要使用者自己实现 c3p0 来加载数据连接池。其实很简单的,只要继承 UnpooledDataSourceFactory 并把 dataSource 实现。我们的 mybatis 就实现了 c3p0 数据库连接池。首先要引入c3p0的jar包:
然后新建一个类,实现dataSource:
接下来在数据源中配置c3p0,将type="POOLED"改为type="C3P0DataSourceFactory",具体修改内容如下:
注意数据源参数的名字有变化。
druid连接池配置
DRUID是阿里巴巴开源平台上一个数据库连接池实现,它结合了C3P0、DBCP、PROXOOL等DB池的优点,同时加入了日志监控,可以很好的监控DB池连接和SQL的执行情况,可以说是针对监控而生的DB连接池,据说是目前最好的连接池。使用druid的步骤和c3p0差不多,首先加入jar包依赖:
然后新建一个类,实现dataSource:
虽然Druid提供了一个同名的DruidDataSourceFactory类,但是不能在MyBatis中直接使用。接下来在数据源中配置druid,具体修改内容如下:
这样在调用的时候可以使用druid线程池。
代码地址:https://gitee.com/blueses/mybatis-demo 03
我们的交流基地,“JAVA互联网技术交流:789650498”欢迎小伙伴们一起来交流:
网友评论