Mybatis遇到的坑

iBatis自己带了一个simple的数据库连接池,基本的功能都有。但是在处理部分数据库(比如mysql)的连接空闲时间太长(mysql是8小时)自动超时的时候,就比不上象c3p0这样的连接池软件了(c3p0能自动处理数据库连接被关闭的情况)

解决方案:

SpringBoot项目application.properties里配置

#<!-- 这是一个底层设置,如果获取连接花费的相当长的时间,它会给连接池打印状态日志并重新尝试获取一个连接(避免在误配置的情况下一直安静的失败),默认值:20000 毫秒(即 20 秒)。 -->
datasource.mysql.jdbc.timetowait=20000
#<!-- 在任意时间可以存在的活动(也就是正在使用)连接数量,默认值:10 -->
datasource.mysql.jdbc.maximumActiveConnections=300
#<!-- 任意时间可能存在的空闲连接数 默认是5,最好设置为0,否则可能会崩溃掉 -->
datasource.mysql.jdbc.maximumidleConnections=0
#<!-- 在被强制返回之前,池中连接被检出(checked out)时间,默认值:20000 毫秒(即 20 秒) -->
datasource.mysql.jdbc.maximumCheckoutTime=20000

#<!-- 配置 poolPingQuery 的使用频度。这可以被设置成匹配具体的数据库连接超时时间,来避免不必要的侦测,默认值:0(即所有连接每一时刻都被侦测 — 当然仅当 poolPingEnabled 为 true 时适用) -->
datasource.mysql.jdbc.poolPingConnectionsNotUsedFor=20000

#<!-- 发送到数据库的侦测查询,用来检验连接是否处在正常工作秩序中并准备接受请求。默认是“NO PING QUERY SET”,这会导致多数数据库驱动失败时带有一个恰当的错误消息。 -->
datasource.mysql.jdbc.poolPingQuery=select 1

 mybatis.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>

	<!-- Settings 必须放到最上面 -->
	<settings>
		<!-- 该配置影响的所有映射器中配置的缓存的全局开关。默认true -->
		<setting name="cacheEnabled" value="false" />
		<!-- MyBatis 利用本地缓存机制(Local Cache)防止循环引用(circular references)和加速重复嵌套查询。 
			默认值为 SESSION,这种情况下会缓存一个会话中执行的所有查询。 若设置值为 STATEMENT,本地会话仅用在语句执行上,对相同 SqlSession 
			的不同调用将不会共享数据。 -->
		<setting name="localCacheScope" value="STATEMENT" />
		<!-- 当没有为参数提供特定的 JDBC 类型时,为空值指定 JDBC 类型。 某些驱动需要指定列的 JDBC 类型,多数情况直接用一般类型即可,比如 
			NULL、VARCHAR 或 OTHER。 -->
		<setting name="jdbcTypeForNull" value="NULL" />
		<!-- MyBatis内置的日志工厂提供日志功能,具体的日志实现有以下几种工具 SLF4J Apache Commons Logging Log4j 
			2 Log4j JDK logging 在诸如 WebSphere的环境中——WebSphere提供了Commons Logging的私有实现,你的Log4J配置将被忽略。 
			因Commons Logging已经存 在了,按照优先级顺序,Log4J自然就被忽略了 如果你的应用部署在一个包含Commons Logging的环境, 
			而你又想用其他的日志框架, 你可以通过在MyBatis的配置文件MyBatis-config.xml里面添加一项setting(配置)来选择一个不同的日志实现。 
			可选值:SLF4J、LOG4J、LOG4J2、JDK_LOGGING、COMMONS_LOGGING、STDOUT_LOGGING、NO_LOGGING -->
		<setting name="logImpl" value="LOG4J2" />
	</settings>

	<!-- 设置数据库连接环境 default 数据库连接环境开关 
	     development 本地环境 Product_Intranet 内网环境 
		 -->
	<environments default="development">
		<environment id="development">
			<!-- 使用JDBC事务管理 -->
			<transactionManager type="JDBC" />
			<!-- 配置数据库连接池 -->
			<dataSource type="POOLED">
				<property name="driver" value="com.mysql.jdbc.Driver" />
				<property name="url"
					value="jdbc:mysql://ip:3306/db_name" />
				<property name="username" value="root" />
				<property name="password" value="root" />
				<!-- 数据库连接池配置 -->
				<!-- 在任意时间可以存在的活动(也就是正在使用)连接数量,默认值:10 -->
				<property name="poolMaximumActiveConnections" value="300" />
				<!-- 任意时间可能存在的空闲连接数 默认是5,最好设置为0,否则可能会崩溃掉 -->
				<property name="poolMaximumIdleConnections" value="0" />
				<!-- 在被强制返回之前,池中连接被检出(checked out)时间,默认值:20000 毫秒(即 20 秒) -->
				<property name="poolMaximumCheckoutTime" value="20000" />
				<!-- 这是一个底层设置,如果获取连接花费的相当长的时间,它会给连接池打印状态日志并重新尝试获取一个连接(避免在误配置的情况下一直安静的失败),默认值:20000 
					毫秒(即 20 秒)。 -->
				<property name="poolTimeToWait" value="20000" />

				<!-- 是否启用侦测查询。若开启,也必须使用一个可执行的 SQL 语句设置 poolPingQuery 属性(最好是一个非常快的 SQL),默认值:false。 -->
				<property name="poolPingEnabled" value="true" />
				<!-- 配置 poolPingQuery 的使用频度。这可以被设置成匹配具体的数据库连接超时时间,来避免不必要的侦测,默认值:0(即所有连接每一时刻都被侦测 
					— 当然仅当 poolPingEnabled 为 true 时适用) -->
				<property name="poolPingConnectionsNotUsedFor" value="3600000" />
				<!-- 发送到数据库的侦测查询,用来检验连接是否处在正常工作秩序中并准备接受请求。默认是“NO PING QUERY SET”,这会导致多数数据库驱动失败时带有一个恰当的错误消息。 -->
				<property name="poolPingQuery" value="select 1" />

			</dataSource>
		</environment>
		<!-- 上线状态内网版 -->
		<environment id="Product_Intranet">
			<!-- 使用JDBC事务管理 -->
			<transactionManager type="JDBC" />
			<!-- 配置数据库连接池 -->
			<dataSource type="POOLED">
				<property name="driver" value="com.mysql.jdbc.Driver" />
				<property name="url"
					value="jdbc:mysql://127.0.0.1:3306/ittack" />
				<property name="username" value="root" />
				<property name="password" value="root" />

				<!-- 数据库连接池配置 -->
				<!-- 在任意时间可以存在的活动(也就是正在使用)连接数量,默认值:10 -->
				<property name="poolMaximumActiveConnections" value="300" />
				<!-- 任意时间可能存在的空闲连接数 默认是5,最好设置为0,否则可能会崩溃掉 -->
				<property name="poolMaximumIdleConnections" value="0" />
				<!-- 在被强制返回之前,池中连接被检出(checked out)时间,默认值:20000 毫秒(即 20 秒) -->
				<property name="poolMaximumCheckoutTime" value="20000" />
				<!-- 这是一个底层设置,如果获取连接花费的相当长的时间,它会给连接池打印状态日志并重新尝试获取一个连接(避免在误配置的情况下一直安静的失败),默认值:20000 
					毫秒(即 20 秒)。 -->
				<property name="poolTimeToWait" value="20000" />

				<!-- 是否启用侦测查询。若开启,也必须使用一个可执行的 SQL 语句设置 poolPingQuery 属性(最好是一个非常快的 SQL),默认值:false。 -->
				<property name="poolPingEnabled" value="true" />
				<!-- 配置 poolPingQuery 的使用频度。这可以被设置成匹配具体的数据库连接超时时间,来避免不必要的侦测,默认值:0(即所有连接每一时刻都被侦测 
					— 当然仅当 poolPingEnabled 为 true 时适用) -->
				<property name="poolPingConnectionsNotUsedFor" value="3600000" />
				<!-- 发送到数据库的侦测查询,用来检验连接是否处在正常工作秩序中并准备接受请求。默认是“NO PING QUERY SET”,这会导致多数数据库驱动失败时带有一个恰当的错误消息。 -->
				<property name="poolPingQuery" value="select 1" />
			</dataSource>
		</environment>
	</environments>

	<!-- 所有数据库语句映射表文件必须在这里注册 -->
	<mappers>
		<!-- 管理员表 -->
		<mapper resource="xxxxx/xxxx/mapper/ManagerMapper.xml" />
	</mappers>
</configuration>

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值