全部產品
Search
文件中心

Lindorm:基於Java JDBC介面的應用開發

更新時間:Jul 06, 2024

Java JDBC(JavaDataBase Connectivity)是一種規範的Java API,主要用於串連和處理資料庫、執行SQL語句。您可以通過Java JDBC介面串連寬表引擎,並結合Lindorm SQL進行應用開發。本文介紹使用MySQL協議,通過Java JDBC介面進行應用開發的方法。

前提條件

  • 已開通MySQL協議相容功能。如何開通,請參見開通MySQL協議相容功能

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

  • 已將用戶端IP添加至白名單,具體操作請參見設定白名單

操作步驟

  1. 添加MySQL JDBC Driver的依賴。以Maven專案為例,在pom.xml檔案的dependencies中添加依賴項。範例程式碼如下:

      <dependency>
          <groupId>mysql</groupId>
          <artifactId>mysql-connector-java</artifactId>
          <version>8.0.33</version>
      </dependency>
    重要
    • 推薦通過8.0及以上版本的MySQL JDBC驅動串連Lindorm寬表引擎。

    • 在Java中建立MySQL JDBC串連依賴於MySQL JDBC驅動包,您需要手動將MySQL JDBC驅動包(mysql-connector-java-x.x.x.jar)添加至CLASSPATH中,否則無法建立MySQL JDBC串連。

  2. 初始化MySQL JDBC用戶端並建立Lindorm用戶端和資料之間的串連。

    Class.forName("com.mysql.jdbc.Driver");
    
    //Lindorm控制台擷取的資料庫使用者名稱。
    String username = "root";
    //Lindorm控制台擷取的資料庫密碼。
    String password = "root";
    //建立串連時可指定某一database。若不指定database,預設使用default。
    String database = "default";
    //Lindorm寬表MySQL相容地址。33060是MySQL協議的連接埠號碼。
    String url = "jdbc:mysql://ld-uf6k8yqb741t3****-proxy-sql-lindorm-public.lindorm.rds.aliyuncs.com:33060/" + database + "?sslMode=disabled&allowPublicKeyRetrieval=true&useServerPrepStmts=true&useLocalSessionState=true&rewriteBatchedStatements=true&cachePrepStmts=true&prepStmtCacheSize=100&prepStmtCacheSqlLimit=50000000";
    Properties properties = new Properties();
    properties.put("user", username);
    properties.put("password", password);
    
    //擷取串連
    Connection connection = DriverManager.getConnection(url, properties);

    參數說明

    參數

    說明

    url

    MySQL協議的Java JDBC串連地址。格式為jdbc:mysql://<MySQL相容地址>/" + database + "?串連配置

    如何擷取MySQL相容地址,請參見查看串連地址。串連配置的詳細說明,請參見串連配置說明

    重要
    • 如果應用部署在ECS執行個體,建議您通過專用網路訪問Lindorm執行個體,可獲得更高的安全性和更低的網路延遲。

    • 如果應用部署在本地,在通過公網串連Lindorm執行個體前需在控制台開通公網地址。開通方式:查看寬表引擎串連地址

    • 通過專用網路訪問時url請填寫MySQL相容地址對應的專用網路地址,通過公網訪問時url請填寫MySQL相容地址對應的公網地址。

    database

    需要串連的資料庫名稱。預設串連default資料庫。

    username

    串連寬表引擎的使用者名稱和密碼。

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

    password

    串連配置說明

    參數

    樣本值

    說明

    sslMode

    disabled

    JDBC驅動建立串連時是否使用SSL建立加密串連。建議設定為disabled,即不使用SSL建立加密串連。設定為disabled可以有效提高效能。

    allowPublicKeyRetrieval

    true

    JDBC驅動建立串連進行使用者認證時,是否允許從伺服器檢RSA公開金鑰。建議設定為true

    useServerPrepStmts

    true

    JDBC驅動是否啟用伺服器端預先處理語句。建議設定為true,即允許資料庫使用其內建的SQL預先處理機制,可提高效能並減少SQL注入問題。

    useLocalSessionState

    true

    JDBC驅動是否啟用本地工作階段狀態,用於降低對資料庫伺服器的往返通訊次數。建議設定為true

    rewriteBatchedStatements

    true

    JDBC驅動是否重寫批量語句。建議設定為true,對於使用預先處理語句並進行批量參數綁定的應用,可以極大提升寫入效能。

    cachePrepStmts

    true

    是否允許緩衝預先處理語句。建議設定為true,可以減少預先處理語句的建立次數,對於頻繁執行的語句有效能提升。

    prepStmtCacheSize

    100

    設定JDBC驅動層面緩衝預先處理語句的個數。該參數僅在cachePrepStmts設定為true時生效。

    prepStmtCacheSqlLimit

    500000

    設定預先處理語句可快取的最大長度,超過此長度的SQL語句不會被緩衝。如果業務對效能比較敏感,建議增加該參數的值。

    說明

    prepStmtCacheSqlLimit值增加可能會消耗更多記憶體資源,建議根據實際需求合理設定。

  3. 建立串連後,通過寬表SQL文法使用Lindorm寬表引擎。範例程式碼如下:

    String tableName = "sql_table_" + new Random().nextInt(1000);
    //建立表
    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);
    }
    
    //插入資料
    String upsertSql = "insert into " + tableName + "(id,name) values(?,?)";
    try (PreparedStatement ps = connection.prepareStatement(upsertSql)) {
      int batchSize = 100;
      for (int i = 0; i < batchSize; i++) {
        ps.setString(1, "aa" + i);
        ps.setString(2, "bb" + i);
        //加入批次
        ps.addBatch();
      }
      int[] ret = ps.executeBatch();
      System.out.println(Arrays.toString(ret));
    }
    
    //查詢資料
    String querySql = "select * from " + tableName + " where id=?";
    try (PreparedStatement ps = connection.prepareStatement(querySql)) {
      ps.setString(1, "aa1");
      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);
      }
    }
    
    //刪除資料
    String deleteSql = "delete from " + tableName + " where id=?";
    try (PreparedStatement ps = connection.prepareStatement(deleteSql)) {
      ps.setString(1, "aa1");
      ps.executeUpdate();
    }
    
    //關閉串連,當結束操作時要確保串連被關閉,否則會造成串連泄漏。
    connection.close();

    寬表SQL文法的使用,請參見SQL文法手冊

    說明
    • batchSize為batch的大小,建議不超過65535/列數,最佳大小為Math.round(65535/列數)。例如,上述代碼中樣本表共2列,batch的大小建議不要超過65535/2 = 32767.5,可以向下取整為32767

    • 在Lindorm SQL中,insert語句的語義與upsert相同。由於MySQL JDBC的用戶端最佳化了insert語句,因此在寫入資料時更推薦您使用insert語句。