1. 程式人生 > 實用技巧 >Mysql連線池

Mysql連線池

MySQL檢視最大連線數和修改最大連線數

1、檢視最大連線數
show variables like '%max_connections%';
2、修改最大連線數
set GLOBAL max_connections = 200;或修改MySQL配置檔案my.ini 或 my.cnf的引數max_connections,將其改為max_connections=??,然後重啟MySQL即可。

通常,mysql的最大連線數預設是100, 最大可以達到16384。

mysql伺服器最大連線數值的設定

  這個引數的大小要綜合很多因素來考慮,比如使用的平臺所支援的執行緒庫數量(windows只能支援到2048)、伺服器的配置(特別是記憶體大小)、每個連線佔用資源(記憶體和負載)的多少、系統需要的響應時間等。

  Can not connect to MySQL server. Too many connections -mysql 1040錯誤,這表示MySQL且還未釋放的連線數目已經達到MySQL的上限。

對於mysql伺服器最大連線數值的設定範圍比較理想的是:伺服器響應的最大連線數值佔伺服器上限連線數值的比例值在10%以上,如果在10%以下,說明mysql伺服器最大連線上限值設定過高.

公式:Max_used_connections / max_connections * 100%

如圖:

mysql設定得最大連線以及伺服器響應得最大連線數

計算得到,差不多在5.3%作用,所以最大連線數設定有些偏高。可以適當的降低

設定方法:vim /etc/my.cnf 然後新增一句max_connections=80

這個時候設定的是最理想的。

當然在現實專案中,出現高併發的問題,不可能按著當前的伺服器響應最大連線數去設定,應該將最大連線數設定到最大,等專案差不多穩定了,或者在日誌中分析出,高併發的數量,從而去調整最大連線數。

什麼是資料庫連線池

建立一個數據庫連線是一件非常耗時(消耗時間)耗力(消耗資源)的事情。之所以會這樣,是因為連線到資料庫伺服器需要經歷幾個漫長的過程:建立物理通道(例如套接字或命名管道),與伺服器進行初次握手,分析連線字串資訊,由伺服器對連線進行身份驗證,執行檢查以便在當前事務中登記等等。我們先不管為什麼會有這樣的機制,存在總是有它的道理。既然新建一條連線如此痛苦,那麼為什麼不重複利用已有的連線呢?

連線池就是這樣一個容器:它存放了一定數量的與資料庫伺服器的物理連線。因此,當我們需要連線資料庫伺服器的時候,只需去池(容器)中取出一條空閒的連線,而不是新建一條連線。這樣的話,我們就可以大大減少連線資料庫的開銷,從而提高了應用程式的效能。

Durid

Druid首先是一個數據庫連線池。Druid是目前最好的資料庫連線池,在功能、效能、擴充套件性方面,都超過其他資料庫連線池,包括DBCP、C3P0、BoneCP、Proxool、JBoss DataSource。Druid已經在阿里巴巴部署了超過600個應用,經過一年多生產環境大規模部署的嚴苛考驗。Druid是阿里巴巴開發的號稱為監控而生的資料庫連線池!

Druid是一個JDBC元件,它包括三個部分:

基於Filter-Chain模式的外掛體系。

DruidDataSource 高效可管理的資料庫連線池。

SQLParser(ast全稱是abstract syntax tree,中文直譯抽象語法樹。SQL解析,本質上就是把SQL字串給解析成ast,也就是說SqlParser的入參是SQL字串,結果就是一個ast。)

Druid的功能

1、替換DBCP和C3P0。Druid提供了一個高效、功能強大、可擴充套件性好的資料庫連線池。

2、可以監控資料庫訪問效能,Druid內建提供了一個功能強大的StatFilter外掛,能夠詳細統計SQL的執行效能,這對於線上分析資料庫訪問效能有幫助。

3、資料庫密碼加密。直接把資料庫密碼寫在配置檔案中,這是不好的行為,容易導致安全問題。DruidDruiver和DruidDataSource都支援PasswordCallback。

4、SQL執行日誌,Druid提供了不同的LogFilter,能夠支援Common-Logging、Log4j和JdkLog,你可以按需要選擇相應的LogFilter,監控你應用的資料庫訪問情況。

5、擴充套件JDBC,如果你要對JDBC層有程式設計的需求,可以通過Druid提供的Filter機制,很方便編寫JDBC層的擴充套件外掛。

所以Druid可以:
1、充當資料庫連線池。
2、可以監控資料庫訪問效能
3、獲得SQL執行日誌

Druid配置使用(springboot下)

  1.pom新增引用

       <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid</artifactId>
            <version>1.1.10</version>
        </dependency>
        <!--自啟動Druid管理後臺-->
        <dependency>
               <groupId>com.alibaba</groupId>
               <artifactId>druid-spring-boot-starter</artifactId>
               <version>1.1.10</version>
        </dependency>    

  2.application.properties配置

### db config ###
spring.datasource.type=com.alibaba.druid.pool.DruidDataSource
spring.datasource.driverClassName=org.postgresql.Driver
spring.datasource.url=jdbc:postgresql://localhost:5432/XXX?useUnicode=true&characterEncoding=utf8&currentSchema=public
spring.datasource.username=postgres
spring.datasource.password=XXX
spring.jpa.properties.hibernate.jdbc.lob.non_contextual_creation=true
spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.PostgreSQLDialect
spring.jpa.properties.hibernate.hbm2ddl.auto=update
#config druid
#連線池的設定
#初始化時建立物理連線的個數
spring.datasource.druid.initial-size=5
#最小連線池數量
spring.datasource.druid.min-idle=5
#最大連線池數量 maxIdle已經不再使用
spring.datasource.druid.max-active=20
#獲取連線時最大等待時間,單位毫秒
spring.datasource.druid.max-wait=60000
#申請連線的時候檢測,如果空閒時間大於timeBetweenEvictionRunsMillis,執行validationQuery檢測連線是否有效。
spring.datasource.druid.test-while-idle=true
#既作為檢測的間隔時間又作為testWhileIdel執行的依據
spring.datasource.druid.time-between-eviction-runs-millis=60000
#銷燬執行緒時檢測當前連線的最後活動時間和當前時間差大於該值時,關閉當前連線
spring.datasource.druid.min-evictable-idle-time-millis=30000
#用來檢測連線是否有效的sql 必須是一個查詢語句
#mysql中為 select 'x'
#oracle中為 select 1 from dual
spring.datasource.druid.validation-query=select 'x'
#申請連線時會執行validationQuery檢測連線是否有效,開啟會降低效能,預設為true
spring.datasource.druid.test-on-borrow=false
#歸還連線時會執行validationQuery檢測連線是否有效,開啟會降低效能,預設為true
spring.datasource.druid.test-on-return=false
#當資料庫丟擲不可恢復的異常時,拋棄該連線
spring.datasource.druid.exception-sorter=true
#是否快取preparedStatement,mysql5.5+建議開啟
#spring.datasource.druid.pool-prepared-statements=true
#當值大於0時poolPreparedStatements會自動修改為true
spring.datasource.druid.max-pool-prepared-statement-per-connection-size=20
#配置擴充套件外掛
spring.datasource.druid.filters=stat,wall
#通過connectProperties屬性來開啟mergeSql功能;慢SQL記錄
spring.datasource.druid.connection-properties=druid.stat.mergeSql=true;druid.stat.slowSqlMillis=500
#合併多個DruidDataSource的監控資料
spring.datasource.druid.use-global-data-source-stat=true
#設定訪問druid監控頁的賬號和密碼,預設沒有
#spring.datasource.druid.stat-view-servlet.login-username=admin
#spring.datasource.druid.stat-view-servlet.login-password=admin

### mybatis config ###
mybatis.config-locations=classpath:mybatis/mybatis-config.xml
mybatis.mapper-locations=classpath:mybatis/mapper/*.xml
mybatis.type-aliases-package=com.jrsc.supervisor.model
### log config ###
logging.config=classpath:logback-spring.xml

  3.輸入http://localhost:9091/druid/webapp.html後,即可看到Druid監控面板