介紹
在開發或者運維過程中,我們連接數據庫的時候突然會遇到"Too many Connections"這種報錯信息;這時我們就需要排除一下是哪些程序客戶端連接較多而沒有釋放。
查看mysql數據庫連接數
查看最大連接數
show variables like 'max_connections';
查看已使用連接數
show status like 'max%connections';
發現已使用的已經大於最大連接數。
更改最大連接數
全局set(臨時)
這種方式重啟mysql后會失效。
set GLOBAL max_connections=1000;
mysql> set GLOBAL max_connections=1000;
Query OK, 0 rows affected (2.00 sec)
查看最大連接數
查看已使用連接數
發現由原來的152變成了159,可以更多的連接。
配置文件修改
修改/etc/my.cnf
配置文件
在[mysqld]
塊中修改或添加:max_connections=1000
,重啟mysql。
查看數據庫連接情況
查看數據庫連接IP列表及數量
select SUBSTRING_INDEX(host,':',1) as ip , count(*) from information_schema.processlist group by ip;
查看數據庫連接數
select count(*) from information_schema.processlist;
查看進程列表
(1)列出前100條
show processlist;
(2)列出所有
show full processlist;
(3)各列的含義
- Id:該進程程序登錄mysql時,系統分配的連接id,即為connection_id。
- User:該進程程序連接mysql的用戶。
- Host:該進程程序連接mysql的ip。
- db:該進程程序連接mysql的某個數據庫。
- Command:該進程程序執行的命令,取值為休眠(Sleep)、查詢(Query)、連接(Connect)等。
- Time:Command狀態持續的時間,單位為秒。
- State:使用當前的sql語句的狀態,如starting。
- Info:顯示sql語句,如當前執行了show full processlist。
查看進程
查看連接數據庫的java進程
數據庫端口為3306,查看連接該端口的java程序進程
netstat -anp | grep 3306 | grep java
查看進程對應的程序
ps -ef | grep 進程號
統計某個進程連接數
netstat -anp | grep 3306 | grep 進程號 | wc -l
通過wc -l
統計出某個進程的連接數。
通過上述一系列操作,我們大概就能知道哪個程序服務連接數較多了。如上述的23818這個進程的連接數最多,為136。這時就需要考慮是否程序中對數據庫連接沒有做一些限制。
Java程序配置數據庫連接池
# 配置數據庫【需要按照具體環境修改】
spring.datasource.url: jdbc:mysql://ip1:3306,ip2:3306,ip3:3306/dbName?useSSL=false&useUnicode=true&&characterEncoding=utf-8
# Username and password
spring.datasource.username: userA
#ENC()前綴為數據庫密碼密文處理,測試時可直接配置數據庫密碼如:spring.datasource.password =123456
spring.datasource.password: ENC(0cHjeDIecX6DZd+T8kfNuukmfdfdsfd)
#spring.datasource.password: 123456
# 指定獲取連接時連接校驗的sql查詢語句
spring.datasource.validation-query: SELECT 1 FROM DUAL
# 配置獲取連接等待超時的時間
spring.datasource.max-wait: 10000
# 獲取連接時候驗證,會影響性能
spring.datasource.test-on-borrow: true
# 配置獲取連接池中最大空閑數
spring.datasource.max-idle: 30
# 配置獲取連接池中最大活躍數
spring.datasource.max-active: 100
# 指定連接池中連接的最大生存時間,毫秒單位
spring.datasource.max-lifetime: 300000
# 指定數據庫連接驅動
spring.datasource.driverClassName: com.mysql.jdbc.Driver
# 指定數據庫類型為MYSQL
spring.jpa.database: MYSQL
# 查詢時是否顯示日志,無需修改
spring.jpa.show-sql: false
# Hibernate ddl auto (create, create-drop, update)
spring.jpa.hibernate.ddl-auto: update
# Naming strategy
spring.jpa.hibernate.naming-strategy: org.hibernate.cfg.ImprovedNamingStrategy
# stripped before adding them to the bean manager)
#spring.jpa.properties.hibernate.dialect: org.hibernate.dialect.MySQL5Dialect
#spring.jpa.properties.hibernate.dialect: com.xxx.yyy.demo.entity.MySQL5DialectUTF8
# 字段無修改命名
spring.jpa.hibernate.naming.physical-strategy: org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl
# 遇到大寫字母 加”_”的命名
# spring.jpa.hibernate.naming.physical-strategy=org.springframework.boot.orm.jpa.hibernate.SpringPhysicalNamingStrategy
jasypt:
encryptor:
password: EbfYkitulv73I2p0mXI50JMXoaxZTKJ7
注意:其中的spring.jpa.properties.hibernate.dialect: com.xxx.yyy.demo.entity.MySQL5DialectUTF8
即為數據庫生成表時為utf-8
的編碼。
package com.xxx.yyy.demo.entity;
import org.hibernate.dialect.MySQL5InnoDBDialect;
/**
* 自動建表(字符集utf-8)
*/
public class MySQL5DialectUTF8 extends MySQL5InnoDBDialect {
@Override
public String getTableTypeString() {
return " ENGINE=InnoDB DEFAULT CHARSET=utf8";
}
}