日本熟妇hd丰满老熟妇,中文字幕一区二区三区在线不卡 ,亚洲成片在线观看,免费女同在线一区二区

使用Java連接池Druid連接數(shù)據(jù)庫

如果您的應(yīng)用側(cè)主要使用Java語言,且數(shù)據(jù)庫連接創(chuàng)建頻繁(例如短連接場景)或連接數(shù)量較大(大于MySQL數(shù)據(jù)庫的連接數(shù)限制),您可以使用Java連接池Druid連接數(shù)據(jù)庫,降低連接建立頻率以減少數(shù)據(jù)庫主線程的開銷。

前提條件

  • 應(yīng)用服務(wù)器已安裝Java環(huán)境且JDK版本在1.8及以上。

  • 已將服務(wù)器IP地址添加至RDS實例白名單中,詳情請參見設(shè)置IP白名單

    說明

    若您的應(yīng)用程序部署在阿里云ECS服務(wù)器上,且ECS與RDS已實現(xiàn)內(nèi)網(wǎng)互通(ECS與RDS實例的地域、VPC均相同),則無需設(shè)置IP白名單。

準備工作

本文以Maven項目為例,介紹使用Druid連接池連接數(shù)據(jù)庫前的準備工作。

說明

Maven是一個Java項目管理工具,其為開發(fā)者提供了一套標準化的Java項目構(gòu)建流程與依賴管理機制。使用Maven創(chuàng)建的Java項目帶有標準化的目錄結(jié)構(gòu),其中pom.xml為項目描述文件,src/main/java目錄存放項目的Java源代碼,src/main/resources目錄存放項目資源文件。

  • 安裝Druid:您需要在pom.xml文件的dependencies中添加以下依賴項安裝Druid,Druid連接池版本建議選擇1.2.13及以上

    <dependency>
        <groupId>com.alibaba</groupId>
        <artifactId>druid</artifactId>
        <version>1.2.19</version>
    </dependency>
  • 通過druid-spring-boot-starter使用連接池Druid時,為了簡化依賴關(guān)系,便于后續(xù)Druid版本的更新維護,您需要在pom.xml文件的dependencies中先排除其依賴的Druid組件,再顯式依賴Druid組件,如下所示。

    <dependency>
        <groupId>com.alibaba</groupId>
        <artifactId>druid-spring-boot-starter</artifactId>
        <version>1.2.19</version>
        <exclusions>
            <exclusion>
                <groupId>com.alibaba</groupId>
                <artifactId>druid</artifactId>
            </exclusion>
        </exclusions>
    </dependency>
    <dependency>
        <groupId>com.alibaba</groupId>
        <artifactId>druid</artifactId>
        <version>1.2.19</version>
    </dependency>

使用Druid連接數(shù)據(jù)庫

  1. 配置連接池參數(shù):您需要在項目的src/main/resources目錄中新建druid.properties文件,并在文件中添加以下內(nèi)容為連接池配置相關(guān)參數(shù),參數(shù)說明詳情請參見Druid連接池常見參數(shù)配置

    說明

    RDS MySQL數(shù)據(jù)庫連接地址和端口的獲取方法,請參見查看和管理實例連接地址和端口

    # 驅(qū)動類名,無需替換
    driverClassName=com.mysql.jdbc.Driver
    
    # url、username、password、database需要替換為業(yè)務(wù)實際的內(nèi)容
    url=jdbc:mysql://rm-bp**************.mysql.rds.aliyuncs.com:3306/database
    username=****
    password=****
    
    # 初始化時創(chuàng)建的連接數(shù)
    initialSize=20
    # 最小空閑連接數(shù)
    minIdle=20
    # 連接池最大連接數(shù)
    maxActive=100
    # 一條物理連接的存活時間
    phyTimeoutMillis=3600000
    # 獲取連接最大等待時間,如果連接池中沒有可用連接且已達到最大連接數(shù),則應(yīng)用獲取連接的請求將被阻塞,最多等待maxWait(毫秒),建議保持不變
    maxWait=5000
    # 連接超時時間,表示數(shù)據(jù)庫驅(qū)動和數(shù)據(jù)庫服務(wù)器之間建立TCP連接的超時時間,單位毫秒
    connectTimeout=20000
    # Socket超時時間,表示通過TCP連接發(fā)送數(shù)據(jù)(執(zhí)行的sql)后,等待響應(yīng)的超時時間,單位毫秒
    socketTimeout=60000
    
    # 連接驗證配置項,建議保持不變
    testWhileIdle=true
    testOnBorrow=false
    testOnReturn=false
    
    # PreparedStatement緩存配置項,此處配置為true表示打開緩存,建議保持不變
    poolPreparedStatements=true
    maxPoolPreparedStatementPerConnectionSize=100
  2. 使用連接池訪問數(shù)據(jù)庫:您需要在src/main/java目錄存放的源代碼文件中導入相關(guān)依賴,構(gòu)建DruidPoolDemo類,通過連接池Druid獲取JDBC的連接信息并訪問MySQL數(shù)據(jù)庫。

    // 導入相關(guān)依賴
    package com.aliyun.rdsfinops.collector.impl;
    import com.alibaba.druid.pool.DruidDataSourceFactory;
    import javax.sql.DataSource;
    import java.io.InputStream;
    import java.sql.*;
    import java.util.Properties;
    
    public class DruidPoolDemo {
        private static DataSource dataSource = null;
        String tableName = "sql_table_test";
        // 加載參數(shù)
        static {
            Properties properties = new Properties();
            // 獲取連接池配置
            InputStream inputStream = DruidPoolDemo.class.getClassLoader().getResourceAsStream("druid.properties");
            try {
                properties.load(inputStream);
                // 初始化連接池
                dataSource = DruidDataSourceFactory.createDataSource(properties);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
        /* 
          后續(xù)數(shù)據(jù)庫操作(見后文)
          創(chuàng)建表:  public void createTable()
          插入數(shù)據(jù):public void insertData()
          查詢數(shù)據(jù):public void selectData()
          刪除數(shù)據(jù):public void deleteData()
        */
    }

連接池常見參數(shù)配置

在使用Druid連接數(shù)據(jù)庫時,建議您根據(jù)下述內(nèi)容為連接池設(shè)置合適的參數(shù),使數(shù)據(jù)庫的運行更穩(wěn)定高效。

重要

為了最大程度地避免潛在的風險和不確定性,在將新的參數(shù)值用于生產(chǎn)環(huán)境前,建議您至少進行一輪完整的功能測試和性能測試,以確保系統(tǒng)穩(wěn)定性和可靠性。

推薦配置的參數(shù)

推薦您在使用Druid連接池時設(shè)置以下參數(shù),降低數(shù)據(jù)庫運行風險。

參數(shù)名

含義

默認值

推薦值

說明

initialSize

連接池初始化時創(chuàng)建的連接數(shù)。

0

20~80

  • 設(shè)置合理的initialSize,應(yīng)用啟動后可以立即處理并發(fā)需求。

  • 建議設(shè)置為平均并發(fā)連接數(shù)的60%至80%。

minIdle

最小空閑連接數(shù)。

0

20~80

  • 適當配置minIdle可以預(yù)留一定數(shù)量的連接,快速處理突發(fā)的數(shù)據(jù)庫請求。

  • 建議參考initialSize的參數(shù)設(shè)置或設(shè)置為JVM在無壓力時保留的連接數(shù)。

  • 活躍連接數(shù)與此參數(shù)無關(guān),其受maxActive參數(shù)控制。

maxActive

連接池最大連接數(shù)。

8

100

  • 該參數(shù)值需根據(jù)應(yīng)用程序的實際需求及數(shù)據(jù)庫的處理能力決定。

  • 建議設(shè)置為數(shù)據(jù)庫能同時處理的最大連接數(shù),或略大于預(yù)計峰值并發(fā)量,預(yù)留一定的連接應(yīng)對突發(fā)流量。

phyTimeoutMillis

一條物理連接的存活時間(毫秒)。

-1

3600000~28800000

  • 默認值-1表示連接永久存在。

  • 參數(shù)值需要根據(jù)實際情況決定,設(shè)置該值是為了防止空閑連接長時間存在,浪費資源。

maxWait

獲取連接時的最大等待時間(毫秒)。

-1

5000

  • 如果連接池中沒有可用連接且已經(jīng)達到最大連接數(shù),則應(yīng)用獲取連接的請求將被阻塞,最多等待該參數(shù)設(shè)定的時間。

  • 默認值-1表示一直等待,0表示不等待(不建議設(shè)置為-10)。

  • 正常情況下,獲取數(shù)據(jù)庫連接的等待時間為10至30毫秒,建議按實際需求或推薦值設(shè)置參數(shù)。

connectTimeout

連接超時的時間(毫秒)。

10000

3000

  • 數(shù)據(jù)庫驅(qū)動與數(shù)據(jù)庫服務(wù)器建立TCP連接的超時時間。

  • 建議設(shè)置為1-10秒之間,取決于網(wǎng)絡(luò)質(zhì)量高低,以及應(yīng)用端與服務(wù)端的距離。

socketTimeout

socket的超時時間(毫秒)。

10000

10000~60000

  • 通過TCP連接發(fā)送數(shù)據(jù)(待執(zhí)行的SQL命令)后,等待響應(yīng)的超時時間。

  • 該參數(shù)值不宜過短,針對SQL執(zhí)行時間明顯過長而導致超時的問題,應(yīng)該首先檢查SQL或者數(shù)據(jù)庫本身,而不是優(yōu)先調(diào)整該參數(shù)。

testWhileIdle

是否開啟空閑連接的檢測。

false

true

建議設(shè)置為true,連接池會定期檢查空閑連接的狀態(tài)。

可選擇配置的參數(shù)

使用Druid連接池時,您可以選擇性地配置以下參數(shù),提升數(shù)據(jù)庫性能。

參數(shù)名

含義

默認值

推薦值

說明

poolPreparedStatements

是否緩存PreparedStatement對象。

true

true

  • 開啟后,在重復(fù)執(zhí)行相同SQL語句時,可以減少編譯SQL語句的次數(shù),提高性能。

  • 開啟后,可以有效防止SQL注入攻擊,增強安全性。

  • 如果業(yè)務(wù)SQL變化較大或業(yè)務(wù)有很多大字段,設(shè)置該參數(shù)會導致大量的JVM內(nèi)存消耗,也會導致較多的數(shù)據(jù)庫服務(wù)端內(nèi)存消耗。

maxPoolPreparedStatementPerConnectionSize

每個連接緩存PreparedStatement對象的最大數(shù)量。

10

100

  • 如果開啟了緩存PreparedStatement對象,連接池會限制每個連接緩存的最大數(shù)量。

  • 對于執(zhí)行大量重復(fù)SQL語句的應(yīng)用,可以將該參數(shù)值調(diào)高,但設(shè)置過高會導致內(nèi)存浪費。

保持默認配置的參數(shù)

對于以下常見的連接池參數(shù),您可以選擇直接使用默認配置或根據(jù)自身需求調(diào)整參數(shù)。

參數(shù)名

含義

默認值

推薦值

說明

failFast

用于控制在獲取連接出現(xiàn)錯誤時的行為。

false

false

  • 一般情況下,保持默認設(shè)置不變。

  • 在錯誤敏感、獲取連接頻繁失敗的場景下,可以將該參數(shù)設(shè)置為true

    • 快速響應(yīng)錯誤:如果連接池已滿或連接超時等,連接獲取操作會在出現(xiàn)錯誤時立即失敗,不會進行重試或等待。

    • 避免長時間等待:在高并發(fā)的場景下,可以與maxWaitThreadCount參數(shù)一起使用,避免長時間等待連接獲取。

timeBetweenEvictionRunsMillis

檢測空閑連接的時間間隔(毫秒)。

60000

60000

  • 連接池會定期(按此參數(shù)時間間隔)檢查連接,判斷空閑時間是否超過minEvictableIdleTimeMillis參數(shù)設(shè)定的最小空閑時間。

  • 建議保持默認參數(shù)值不變。如果要修改此值,應(yīng)當根據(jù)具體情況進行調(diào)整,以達到最佳的連接池利用率和性能表現(xiàn)。

后續(xù)數(shù)據(jù)庫操作

您可以在DruidPoolDemo類中添加自定義函數(shù),滿足對數(shù)據(jù)庫操作的需求,本文以創(chuàng)建數(shù)據(jù)表、插入數(shù)據(jù)、查詢數(shù)據(jù)、刪除數(shù)據(jù)為例。

創(chuàng)建表

String tableName = "sql_table_test";
public void createTable() throws SQLException {
    // 創(chuàng)建表
    try (Connection connection = dataSource.getConnection()) {
        try (Statement statement = connection.createStatement()) {
            String sql = "create table if not exists " + tableName + "(id VARCHAR(255), name VARCHAR(255), PRIMARY KEY (id))";
            int ret = statement.executeUpdate(sql);
            System.out.println(ret);
        }
    }
}

插入數(shù)據(jù)

String tableName = "sql_table_test";
public void insertData(){
    // 插入數(shù)據(jù)
    try (Connection connection = dataSource.getConnection()) {
        String sql = "insert into " + tableName + "(id,name) values(?,?)";
        try (PreparedStatement ps = connection.prepareStatement(sql)) {
            ps.setString(1, "aa");
            ps.setString(2, "bb");
            int ret = ps.executeUpdate();
            System.out.println(ret);
        }
    } catch (SQLException e) {
        e.printStackTrace();
    }
}

查詢數(shù)據(jù)

String tableName = "sql_table_test";
public void selectData() throws SQLException {
    // 查詢數(shù)據(jù)
    try (Connection connection = dataSource.getConnection()) {
        String sql = "select * from " + tableName + " where id=?";
        try (PreparedStatement ps = connection.prepareStatement(sql)) {
            ps.setString(1, "aa");
            ResultSet rs = ps.executeQuery();
            while (rs.next()) {
                String id = rs.getString(1);
                String name = rs.getString(2);
                System.out.println("id=" + id);
                System.out.println("name=" + name);
            }
        }
    }
}

刪除數(shù)據(jù)

String tableName = "sql_table_test";
public void deleteData(){
    // 刪除數(shù)據(jù)
    try (Connection connection = dataSource.getConnection()) {
        String sql = "delete from " + tableName + " where id=?";
        try (PreparedStatement ps = connection.prepareStatement(sql)) {
            ps.setString(1, "aa");
            ps.executeUpdate();
        }
    } catch (SQLException e) {
        e.printStackTrace();
    }
}

相關(guān)文檔