全部產品
Search
文件中心

Lindorm:基於Java串連池Druid的應用開發

更新時間:Jul 12, 2025

本文介紹基於JDBC串連池Druid串連並訪問Lindorm寬表引擎的使用方法。

前提條件

  • 已安裝Java環境,要求安裝JDK 1.8及以上版本。

  • 已配置白名單,具體操作,請參見設定白名單

  • 寬表引擎的版本為2.3.1及以上版本,如何升級版本,請參見升級小版本

注意事項

  • Lindorm前端接入節點使用SLB做負載平衡,用戶端串連前端節點。為了將用戶端請求較為均勻地發送到各個前端節點,建議串連保持的時間不宜太長,可以配置phyMaxUseCountphyTimeoutMillis參數。

  • 執行查詢前從串連池擷取串連,執行完查詢後要及時調用conn.close()將串連返回到串連池中。再次使用時,請從串連池中擷取新串連,避免長時間使用一個串連導致Druid無法及時檢查到串連失效。

  • 在複雜網路環境下,若遇到網關效能達到瓶頸、網路鏈路長、網路抖動、重傳率或丟包率高等情況,可能會導致串連中斷。建議確保串連池配置合理,並在必要時通過業務代碼側的重試機制最佳化。

  • 服務端升級重啟時,串連可能會短暫中斷。即使使用了串連池,業務側仍可能感知到異常。建議捕獲異常並重試。

  • 根據業務情況合理調整串連池配置,並確保配置生效。您可以在程式中通過DruidDataSource#getStatData()DruidDataSource#dump()方法定期擷取生效的配置與串連池的資訊,並在日誌中查看、核對相關配置資訊。

準備工作

  • 通過串連池Druid串連Lindorm寬表引擎前,需要安裝串連池Druid和Lindorm JDBC Driver。以Maven專案為例,在pom.xml檔案的dependencies中添加以下依賴項。

    <dependency>
      <groupId>com.alibaba</groupId>
      <artifactId>druid</artifactId>
      <version>1.2.11</version>
    </dependency>
    <dependency>
      <groupId>com.aliyun.lindorm</groupId>
      <artifactId>lindorm-all-client</artifactId>
      <version>2.2.1.3</version>
    </dependency>
  • 當通過druid-spring-boot-starter使用Druid串連池時,需要先排除druid-spring-boot-starter依賴的Druid組件,然後顯式依賴Druid組件,如下所示。

    <dependency>
       <groupId>com.alibaba</groupId>
       <artifactId>druid-spring-boot-starter</artifactId>
       <version>1.2.11</version>
       <exclusions>
          <exclusion>
             <groupId>com.alibaba</groupId>
             <artifactId>druid</artifactId>
          </exclusion>
       </exclusions>
    </dependency>
    <dependency>
      <groupId>com.alibaba</groupId>
      <artifactId>druid</artifactId>
      <version>1.2.11</version>
    </dependency>
    <dependency>
      <groupId>com.aliyun.lindorm</groupId>
      <artifactId>lindorm-all-client</artifactId>
      <version>2.2.1.3</version>
    </dependency>

操作步驟

說明

您可以直接下載範例程式碼在本地編譯和運行,也可以使用範例程式碼開發您的專案代碼。

  1. 配置串連池Druid的參數。在Maven專案的src/main/resources目錄中建立druid.properties檔案,並在檔案中添加以下內容。

    # 驅動類名,無需替換
    driverClassName=com.aliyun.lindorm.table.client.Driver
    # url、username、password需要替換為業務實際的內容,可以在Lindorm控制台上擷取
    url=jdbc:lindorm:table:url=http://ld-bp17j28j2y7pm****.lindorm.rds.aliyuncs.com:30060
    username=****
    password=****
    # 串連屬性,指定要串連的database,需根據實際情況將****替換為實際的內容
    connectionProperties=database=****
    
    # 初始化串連池即建立串連,建議保持不變
    init=true
    # 初始化串連池時建立串連的個數,可以根據實際情況調整
    initialSize=10
    # 串連池中維護的空閑串連的數量,可以根據實際情況調整。對效能要求高的情境建議和maxActive的值相同;如果業務存在明顯的峰穀波動,可以設定小一些
    minIdle=40
    # 串連池中允許的最大串連數量,可以根據實際情況調整,建議與業務線程池大小相同
    maxActive=40
    # 擷取串連最大等待時間,單位毫秒,建議保持不變
    maxWait=30000
    
    # 配置一個串連最大使用次數,避免長時間使用相同串連造成伺服器端負載不均衡,對效能略有影響
    druid.phyMaxUseCount=10000
    
    # 串連保活配置項,建議保持不變,否則可能出現串連斷開
    # 異常ConnectionDisconnectedException
    druid.keepAlive=true
    druid.keepAliveBetweenTimeMillis=30000
    minEvictableIdleTimeMillis=300000
    maxEvictableIdleTimeMillis=600000
    timeBetweenEvictionRunsMillis=5000
    phyTimeoutMillis=1800000
    
    # 串連驗證配置項,建議保持不變
    validationQuery=SELECT 1
    testWhileIdle=true
    testOnBorrow=false
    testOnReturn=false
    
    # PreparedStatement緩衝配置項,這裡配置為關閉緩衝,建議保持不變
    # 否則運行時可能會出現NoSuchStatement異常
    poolPreparedStatements=false
    maxOpenPreparedStatements=-1
    druid.maxPoolPreparedStatementPerConnectionSize=-1
    說明
    • 請根據注釋說明替換或者調整以下配置項:

      • url:串連寬表引擎的串連地址,擷取方法請參見擷取串連資訊

      • username:訪問寬表引擎的使用者名稱,通過Lindorm寬表引擎的叢集管理系統查看,具體請參見系統管理使用者

      • password:訪問寬表引擎的密碼。如果您忘記了密碼,可以通過Lindorm寬表引擎的叢集管理系統修改密碼,具體操作請參見修改使用者密碼

    • 更多配置項的說明請參見DruidDataSource配置屬性列表

  2. 載入串連池Druid的參數並初始化串連池Druid。

    // 載入參數
    Properties properties = new Properties();
    InputStream inputStream = DruidPoolDemo.class.getClassLoader().getResourceAsStream("druid.properties");
    properties.load(inputStream);
    // 初始化串連池
    DataSource dataSource = DruidDataSourceFactory.createDataSource(properties);
  3. 通過串連池Druid擷取JDBC的串連資訊並訪問Lindorm寬表引擎。

    /* -------------- 基於JDBC的訪問樣本 ----------------- */
    
    String tableName = "sql_table_" + new Random().nextInt(1000);
    // 建立表
    try (Connection connection = dataSource.getConnection()) {
        try (Statement statement = connection.createStatement()) {
            String sql = "create table if not exists " + tableName + "(id VARCHAR, name VARCHAR, primary key(id))";
            int ret = statement.executeUpdate(sql);
            System.out.println(ret);
        }
    }
    
    // 插入資料
    try (Connection connection = dataSource.getConnection()) {
        String sql = "upsert 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);
        }
    }
    
    // 查詢資料
    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);
            }
        }
    }
    
    // 刪除資料
    try (Connection connection = dataSource.getConnection()) {
        String sql = "delete from " + tableName + " where id=?";
        try (PreparedStatement ps = connection.prepareStatement(sql)) {
            ps.setString(1, "aa");
            ps.executeUpdate();
        }
    }

附錄:串連池負載平衡說明

串連池模式(TCP長串連)的效率更高,但在以下情境中對分布式負載平衡不友好,可能導致串連負載不均勻:

  • 突發建立大量串連,導致分布不均

    當應用突發建立了大量的串連時,若負載平衡裝置未能及時重新整理後端節點的串連統計資訊,可能會導致部分後端LDServer節點承載較多的串連請求。同時,疊加串連池化機制,最終會導致部分LDServer節點壓力高於其他節點,串連分布不均,影響系統總體效能。

  • 負載平衡探活異常,導致分布不均

    負載平衡通過主動探活來判斷後端節點是否正常,當探活出現偶發異常時,可能會導致部分LDServer節點上串連較少,結合串連池化,最終會導致部分LDServer壓力低於其他節點,影響系統總體效能。

Druid串連池增加了phyTimeoutMillisphyMaxUseCount參數,定期(例如每執行30分鐘或者10,000次)重新整理串連池中的串連,可以在解決上述問題的同時保持效能基本不變,建議預設添加這兩個參數。