首先我们来看一下mybatis中文网的官方解释:
UNPOOLED– 这个数据源的实现会每次请求时打开和关闭连接。虽然有点慢,但对那些数据库连接可用性要求不高的简单应用程序来说,是一个很好的选择。 性能表现则依赖于使用的数据库,对某些数据库来说,使用连接池并不重要,这个配置就很适合这种情形。UNPOOLED 类型的数据源仅仅需要配置以下 5 种属性:
属性 | 解释 |
---|---|
driver | 这是 JDBC 驱动的 Java 类全限定名(并不是 JDBC 驱动中可能包含的数据源类)。 |
url | 这是数据库的 JDBC URL 地址。 |
username | 登录数据库的用户名。 |
password | 登录数据库的密码。 |
defaultTransactionIsolationLevel | 默认的连接事务隔离级别。 |
defaultNetworkTimeout | 等待数据库操作完成的默认网络超时时间(单位:毫秒)。查看 java.sql.Connection#setNetworkTimeout() 的 API 文档以获取更多信息。作为可选项,你也可以传递属性给数据库驱动。只需在属性名加上“driver.”前缀即可,例如:driver.encoding=UTF8 ,这将通过 DriverManager.getConnection(url, driverProperties) 方法传递值为 UTF8 的 encoding 属性给数据库驱动。 |
POOLED– 这种数据源的实现利用“池”的概念将 JDBC 连接对象组织起来,避免了创建新的连接实例时所必需的初始化和认证时间。 这种处理方式很流行,能使并发 Web 应用快速响应请求。
除了上述提到 UNPOOLED 下的属性外,还有更多属性用来配置 POOLED 的数据源:
属性 | 解释 |
---|---|
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 时适用)。 |
相信看了上面的解释多多少少有点头疼,总结一下:
unpooled不使用数据库连接池,每次连接请求都会创建新的Connection连接对象。
.
pooled使用mybatis框架自带数据库连接池,在要使用连接对象时会从数据库连接池中获取Connection连接对象。
在这就得提一下数据库连接池的优点了:
- java程序执行过程是在jvm中进行的,而jvm和数据库之间每次建立连接都会消耗大量的内存资源,连接对象过多会影响程序的执行效率。
- 数据库连接池中存放了已经创建的Connection连接对象(可自定义配置数量),而连接对象一般都会设置数量限制,防止建立的Connection对象过多导致数据库服务器崩溃宕机。
- 当需要获取数据库连接对象的时候直接在数据库连接池当中取,用完连接对象之后归还到池中,当连接对象都被占用时,其他进程只能等待连接对象的释放,再进行连接对象的获取。