<p><iframe name="ifd" src="https://mnifdv.cn/resource/cnblogs/LearnMysql" frameborder="0" scrolling="auto" width="100%" height="1500"></iframe></p>
Druid
Druid連接池是阿里巴巴開源的數據庫連接池項目.
https://github.com/alibaba/druid/wiki/Druid%E8%BF%9E%E6%8E%A5%E6%B1%A0%E4%BB%8B%E7%BB%8D
為啥要用連接池
1.數據庫本身也是個TCP服務器,客戶端和數據庫通信首先需要先連接TCP服務器
然后再根據數據庫的協議連接上數據庫.
服務器回復 "Response OK" 的消息體就說明連接上了.
2.現在有兩個問題需要解決:很多用戶連接通信的問題 ,和需要快速操作數據的問題
實際上連接數據庫的客戶端的個數是有限的;
如果有200個用戶同時都建立鏈接,那么有一部分用戶就連接不上了.
用戶可以用命令看一下 show variables like '%max_connections%';
咱每次操作數據庫的時候都需要連接的步驟,這個步驟每次都有延遲!!體驗一點不好!
3.解決以上問題的最好方式是加一個對外的接口和一個連接池
對外接口的作用是拿到數據以后調用數據庫連接池,然后由連接池和數據庫通信.
數據庫連接池其實就是提前預先建立了多個數據庫連接對象;
假設建立了20個和數據庫的連接.
4.連接池的作用
連接池里面的的客戶端都是早已和數據庫連接着的,當需要和數據庫通信的時候
就從里面取出一個來客戶端,然后發數據通信.省去了連接數據庫的過程,提高了效率!
如果請求非常多,那么最多也就只有20個連接.不會造成因為連接個數過多而導致數據庫性能下降!
注:有些用戶會想,這不是也有問題嘛!才20個! 接着往下看!
連接池的作用就是省去了連接數據庫的過程,提高了數據通信速度.
防止過多的連接和數據庫相連而導致數據庫性能下降!
5.接口的作用
在網絡通信中,這個接口一般是 http接口,當然也可以是TCP接口,mqtt接口,WebSocket接口等;以下皆說為 接口
接口的作用一部分是為了接受客戶過來的數據,另一部分就是緩存用戶過來的數據.
然后呢就是不停的到數據庫連接池里面去拿連接對象,然后和數據庫進行交互!
然后有人會問?解決了20個問題了沒??
可以說解決了99%了.
大家要明確一個事情,看似數據被緩存了不假 ,但是網絡通信的速度是非常快的,其實上百個乃至上千個用戶訪問數據
他們不會感受到的.
剩下的1%其實就是應對極端情況,上百萬,千萬的人...
內部處理思路還是上面那個樣子,但是呢為了應對這種極端情況就要采取下面的措施
1.優化代碼,提高代碼的執行效率
2.多開幾台服務器
Druid連接池使用
Druid其實是對連接數據庫的對象進行管理,所以咱也需要連接數據庫的jar包(JDBC).
因為5.X的MySQL數據庫和8.X的MySQL數據庫的連接jar包不一樣了,所以我提供了兩份程序.
注:兩份程序的Druid的jar包是一樣的,只是連接MySQL數據庫jar不一樣
先看連接8.X的數據庫(運行可能報錯,請往下面看)
1.導入jar包什么的自己導入,我用的軟件是 intellij idea
2.數據庫
3.我只寫了插入一個數據的程序
package com.company; import com.alibaba.druid.pool.DruidDataSource; import java.sql.Connection; import java.sql.PreparedStatement; public class Main { /*聲明Druid連接池的對象*/ private static DruidDataSource dataSource; /*8.X版本連接器寫法*/ static final String JDBC_DRIVER = "com.mysql.cj.jdbc.Driver"; /*數據庫地址*/ static final String DB_URL = "jdbc:mysql://localhost/userinfo?" + "useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=GMT"; public static void main(String[] args) { initDataSource();// 初始化連接池 try{//插入一個數據 String sql = "insert into userinfo (username,password)"+ "values(" +"'"+ "yangyang" +"'"+ "," +"'"+"11111111"+"'"+")"; Connection connection = getConnect();//在連接池里面獲取連接對象 PreparedStatement ps = connection.prepareStatement(sql);//預編譯下SQL語句 int count = ps.executeUpdate();//提交SQL語句 System.out.println(count);//打印受影響的行數(不為0說明執行了!) }catch (Exception e){ System.out.println(e.toString()); } } // 初始化連接池 private static void initDataSource() { try { dataSource = new DruidDataSource(); // 創建Druid連接池 dataSource.setDriverClassName(JDBC_DRIVER); // 設置連接池的數據庫驅動 dataSource.setUrl(DB_URL); // 設置數據庫的連接地址 dataSource.setUsername("iot"); // 數據庫的用戶名 dataSource.setPassword("11223344."); // 數據庫的密碼 dataSource.setInitialSize(1); // 設置連接池的初始大小 dataSource.setMinIdle(1); // 設置連接池大小的下限 dataSource.setMaxActive(20); // 設置連接池大小的上限 }catch (Exception e){ System.out.println(e.toString()); } } //從連接池里面獲取一個連接對象 public static Connection getConnect() throws Exception{ Connection con=null; try { con=dataSource.getConnection(); } catch (Exception e) { throw e; } return con; } }
4.運行以后
5.提示:8.0的需要JDK1.8版本的,如果你的jar包是1.8以下版本的將會報錯
用戶可以安裝上1.8版本的jar包,
注意只安裝上,不用配置環境變量!
注意只安裝上,不用配置環境變量!
注意只安裝上,不用配置環境變量!
然后設置下軟件使用的jdk (根據自己的軟件百度下設置JDK)
其實就是選擇下JDK的安裝路徑(根據自己的軟件百度)
選擇要使用的JDK版本
現在看連接5.X的數據庫
1.把jar包換了
2.JDK選擇的 1.7
3.驅動器名字改為了
4.運行測試