目录

  • 1 设置最大连接数
  • 2 查看当前连接列表
  • 3 关闭某个连接
  • 4 JDBC连接
  • 5 mybatis连接池
  • 5.1 理解
  • 5.2 获取释放连接流程
  • 5.2.1 获取连接
  • 5.2.2 配置文件
  • 5.2.3 配置参考
  • 6 总结


1 设置最大连接数

可以修改/etc/mysql/mysql.conf.d/mysqld.cnf配置文件中max_connections来设置最大连接数;
进入MySQL后可以查看最大连接数:show variables like '%max_connections%';

+-----------------+-------+
| Variable_name   | Value |
+-----------------+-------+
| max_connections | 10    |
+-----------------+-------+

2 查看当前连接列表

show processlist;

+----+------+----------------------+----------+---------+------+----------+------------------+
| Id | User | Host                 | db       | Command | Time | State    | Info             |
+----+------+----------------------+----------+---------+------+----------+------------------+
| 21 | lwj  | localhost            | NULL     | Query   |    0 | starting | show processlist |
| 24 | lwj  | 222.178.10.174:59393 | datasets | Sleep   |  351 |          | NULL             |
+----+------+----------------------+----------+---------+------+----------+------------------+

如果超过了最大连接数,客户端还请求连接数据库的话,报错(Too many connections)

3 关闭某个连接

kill thread_id;

4 JDBC连接

当执行java代码Connection conn = DriverManager.getConnection(url, name,pwd); 就获得了一个与数据库的连接;

5 mybatis连接池

5.1 理解

在mybatis工具中可以配置连接池,因为用户关心的只是向特定的数据库进行增删改查,并不关心连接,这部分应该被封装起来。这里面有两种连接,一种是连接上了但是没有执行sql语句,称之为idle空闲状态;另一种连接是正在执行sql语句的连接称之为active状态。

5.2 获取释放连接流程

5.2.1 获取连接

当需要使用SQLSession执行sql语句时,就需要得到一个连接来执行这个sql语句,流程如下:

  1. 查看空闲连接集合是否有空闲连接对象,若有就返回一个,没有就执行2;
  2. 查看活动连接集合是否满,若没有满,则创建连接对象,放到活动连接集合,并返回它,若已经满,执行3;
  3. 线程阻塞等待获取连接;

使用完成之后返还连接给空连接集合;

5.2.2 配置文件

<dataSource type="POOLED">
        <property name="driver" value="${oracle.driver}"/>
        <property name="url" value="${oracle.url}"/>
        <property name="username" value="${oracle.username}"/>
        <property name="password" value="${oracle.password}"/>
        <property name="poolMaximumActiveConnections" value="10"/> <!--最大活跃连接数 -->
        <property name="poolMaximumIdleConnections" value="5"/>  <!--最大空闲连接数-->
</dataSource>

5.2.3 配置参考

该参考配置可以和线程池的相互理解:java多线程(十四)线程池

  • 最大活动连接=最大空闲连接:当执行完任务后,连接被放回到空闲连接;
  • 最大空闲连接=0:连接池无法存放多余的空闲连接,每次连接执行完毕都直接释放,每次使用都创建新的连接,不推荐
  • 最大活动连接<最大空闲连接:等效于最大活动连接=最大空闲连接,因为活动连接执行完毕后,都会放回空闲连接,每次取又是从空闲连接取,所以不会多出连接;
  • 最大活动连接>最大空闲连接:这是比较好的实践,当任务较轻时,保留较少部分的空闲连接,当任务较重的时,又允许产生较多的活动连接,使用完毕时候就释放一些,只保留少部分;

注意:当从数据库获取新连接的时候,mybatis的其他活动连接不执行语句操作,所以sqlSessionFactory的最佳实践是全局仅一个的单例模式,而且连接是懒加载的;

6 总结

连接数据库是耗时的,连接池是一个好的实践方式。