基于Java JDBC接口的应用开发

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语句。