基于LindormDataSource的应用开发

LindormDataSource封装了开箱即用的最佳配置,支持全类型Lindorm实例(单可用区、多可用区)访问,是面向Lindorm访问的最佳高性能JDBC连接池。在使用多可用区Lindorm宽表实例时,LindormDataSource可灵活适配多种访问策略,如就近可用区访问、指定可用区访问、随机可用区访问等。

前提条件

连接参数说明

说明

本参数说明适用于本文所有示例。

当通过MySQL协议访问Lindorm时,如果连接地址和属性文件(Properties)中均未指定连接配置,LindormDataSource将会自行填充以提升SQL访问性能,因此您仅需填写下表参数即可。更详细的说明,请参见附录

参数

说明

JdbcUrl(jdbcUrl)

MySQL协议的Java JDBC连接地址。格式为jdbc:mysql://<MySQL兼容地址>/<数据库名>

数据库名不填写时默认连接default数据库。MySQL兼容地址获取方式:查看连接地址

重要
  • 如果应用部署在ECS实例,建议您通过专有网络访问Lindorm实例,以获得更高的安全性和更低的网络延迟。

  • 如果应用部署在本地,在通过公网连接Lindorm实例前需在控制台开通公网连接地址

  • 通过专有网络访问时JdbcUrl请填写MySQL兼容地址对应的专有网络地址,通过公网访问时JdbcUrl请填写MySQL兼容地址对应的公网地址。

Username(username)

连接宽表引擎的用户名和密码。

如果您忘记用户密码,可以通过Lindorm宽表引擎的集群管理系统修改用户密码

Password(password)

JDBC应用接入

  1. 通过LindormDataSource连接Lindorm宽表引擎前,需要安装相关依赖。

    Maven项目为例,在pom.xml文件的dependencies中添加以下依赖项。

    <dependency>
        <groupId>com.mysql</groupId>
        <artifactId>mysql-connector-j</artifactId>
        <version>8.3.0</version>
    </dependency>
    
    <dependency>
        <groupId>com.aliyun.lindorm</groupId>
        <artifactId>lindorm-sql-datasource</artifactId>
        <version>2.2.1.4</version>
    </dependency>
  2. 您可以通过以下两种方式连接Lindorm宽表引擎。

    • 在业务代码中建立连接

      import com.aliyun.lindorm.sql.client.datasource.LindormDataSource;
      import com.aliyun.lindorm.sql.client.datasource.LindormDataSourceConfig;
      import java.sql.Connection;
      import java.sql.PreparedStatement;
      import java.sql.ResultSet;
      
      public class test {
          public static void main(String[] args) throws Exception{
              LindormDataSourceConfig lindormDataSourceConfig = new LindormDataSourceConfig();
              lindormDataSourceConfig.setJdbcUrl("jdbc:mysql://ld-bp1mq0tdzbx1m****-proxy-lindorm-pub.lindorm.aliyuncs.com:33060/database");
              lindormDataSourceConfig.setUsername("r***");
              lindormDataSourceConfig.setPassword("p***");
              lindormDataSourceConfig.setMaximumPoolSize(30);
              LindormDataSource lindormDataSource = new LindormDataSource(lindormDataSourceConfig);
      
              try (Connection connection = lindormDataSource.getConnection()) {
                  String sql = "select * from " + tableName + " where id=?";
                  try (PreparedStatement ps = connection.prepareStatement(sql)) {
                      ps.setString(1, "001");
                      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);
                      }
                  }
              }
      
          }
      }
    • 通过配置文件建立连接

      1. Maven项目的src/main/resources目录中新建lindorm.properties文件,并在文件中添加以下内容:

        jdbcUrl=jdbc:mysql://ld-bp1mq0tdzbx1m****-proxy-lindorm-pub.lindorm.aliyuncs.com:33060/default
        username=r***
        password=p***
        maximumPoolSize=30
      2. 在您的业务代码中添加以下内容。

        LindormDataSourceConfig config = new LindormDataSourceConfig("lindorm.properties");
        LindormDataSource lindormDataSource = new LindormDataSource(config);

Spring-Boot 2.x应用接入

  1. 通过LindormDataSource连接Lindorm宽表引擎前,需要安装相关依赖。

    Maven项目为例,在pom.xml文件的dependencies中添加以下依赖项。

    <dependency>
        <groupId>com.mysql</groupId>
        <artifactId>mysql-connector-j</artifactId>
        <version>8.3.0</version>
    </dependency>
    
    <dependency>
        <groupId>com.aliyun.lindorm</groupId>
        <artifactId>lindorm-sql-datasource-springboot-starter</artifactId>
        <version>2.2.1.4</version>
    </dependency>
  2. 添加Spring配置。在Maven项目的src/main/resources目录中新建application.yml文件,并在文件中添加以下内容。

    spring:
      datasource:
        lindorm:
          jdbc-url: jdbc:mysql://ld-bp167w8n1ab5p****-proxy-sql-lindorm.lindorm.rds.aliyuncs.com:33060/db1
          username: r***
          password: t***
          maximum-pool-size: 30
  3. 编写业务代码。

    @Service
    public class DatabaseService {
    
      @Autowired
      private DataSource dataSource;
    
      public void createUser(User user) throws SQLException {
        String sql = "INSERT INTO users (name, age) VALUES (?, ?)";
    
        try (Connection conn = dataSource.getConnection();
            PreparedStatement ps = conn.prepareStatement(sql)) {
          ps.setString(1, user.getName());
          ps.setInt(2, user.getAge());
          ps.executeUpdate();
        }
      }
    }

Spring-Boot 3.x应用接入

  1. 通过LindormDataSource连接Lindorm宽表引擎前,需要安装相关依赖。

    Maven项目为例,在pom.xml文件的dependencies中添加以下依赖项。

    <dependency>
        <groupId>com.mysql</groupId>
        <artifactId>mysql-connector-j</artifactId>
        <version>8.3.0</version>
    </dependency>
    
    <dependency>
        <groupId>com.aliyun.lindorm</groupId>
        <artifactId>lindorm-sql-datasource-springboot-3-starter</artifactId>
        <version>2.2.1.4</version>
    </dependency>
  2. 添加Spring配置。在Maven项目的src/main/resources目录中新建application.yml文件,并在文件中添加以下内容。

    spring:
      datasource:
        lindorm:
          jdbc-url: jdbc:mysql://ld-bp167w8n1ab5p****-proxy-sql-lindorm.lindorm.rds.aliyuncs.com:33060/db1
          username: r***
          password: r***
          maximum-pool-size: 30
  3. 编写业务代码。

    @Service
    public class DatabaseService {
    
      @Autowired
      private DataSource dataSource;
    
      public void createUser(User user) throws SQLException {
        String sql = "INSERT INTO users (name, age) VALUES (?, ?)";
    
        try (Connection conn = dataSource.getConnection();
            PreparedStatement ps = conn.prepareStatement(sql)) {
          ps.setString(1, user.getName());
          ps.setInt(2, user.getAge());
          ps.executeUpdate();
        }
      }
    }

MyBatis应用接入

在使用MyBatis时,如果基于Spring-Boot框架,可以在Spring-Boot中完成MyBatis配置。如果独立使用MyBatis(不依赖Spring-Boot),请按照以下步骤进行配置。

  1. 通过LindormDataSource连接Lindorm宽表引擎前,需要安装相关依赖。

    Maven项目为例,在pom.xml文件的dependencies中添加以下依赖项。

    <dependency>
        <groupId>com.mysql</groupId>
        <artifactId>mysql-connector-j</artifactId>
        <version>8.3.0</version>
    </dependency>
    
    <dependency>
        <groupId>com.aliyun.lindorm</groupId>
        <artifactId>lindorm-sql-datasource</artifactId>
        <version>2.2.1.4</version>
    </dependency>
  2. 您可以通过以下两种方式连接Lindorm宽表引擎。

    • 在业务代码中建立连接

      SqlSessionFactoryBean sessionFactoryBean = new SqlSessionFactoryBean();
      
      LindormDataSource dataSource = new LindormDataSource();
      dataSource.setJdbcUrl("jdbc:mysql://ld-bp1mq0tdzbx1m****-proxy-lindorm-pub.lindorm.aliyuncs.com:33060");
      dataSource.setUsername("r***");
      dataSource.setPassword("r***");
      sessionFactoryBean.setDataSource(dataSource);
      
      SqlSessionFactory sessionFactory = sessionFactoryBean.getObject();
      try (SqlSession session = sessionFactory.openSession(true)) {
          UserMapper mapper = session.getMapper(UserMapper.class);
          mapper.insert(user);
      }
    • 通过配置文件建立连接

      1. 定义一个符合MybatisDataSourceFactory。

        package com.example.datasource;
        
        import com.aliyun.lindorm.sql.client.datasource.LindormDataSource;
        import com.aliyun.lindorm.sql.client.datasource.LindormDataSourceConfig;
        import org.apache.ibatis.datasource.DataSourceFactory;
        
        public class LindormDataSourceFactory implements DataSourceFactory {
          private Properties props;
        
          @Override
          public void setProperties(Properties props) {
            this.props = props;
          }
        
          @Override
          public DataSource getDataSource() {
            LindormDataSourceConfig config = new LindormDataSourceConfig(props);
            LindormDataSource dataSource = new LindormDataSource(config);
            return dataSource;
          }
        }
        
      2. Maven项目的src/main/resources目录中新建mybatis-config.properties文件,并在文件中添加以下内容:

        <?xml version="1.0" encoding="UTF-8" ?>
        <!DOCTYPE configuration
                PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
                "http://mybatis.org/dtd/mybatis-3-config.dtd">
        <configuration>
            <environments default="development">
                <environment id="development">
                    <transactionManager type="JDBC"/>
                    <dataSource type="com.example.datasource.LindormDataSourceFactory">
                        <property name="jdbcUrl"
                                  value="jdbc:mysql://ld-8vbn68478unu8****-proxy-sql-lindorm.lindorm.rds.aliyuncs.com:33060/lindorm_test"/>
                        <property name="username" value="r***"/>
                        <property name="password" value="t***"/>
                        <property name="maximumPoolSize" value="30"/>
                    </dataSource>
                </environment>
            </environments>
        
            <mappers>
                <mapper class="com.example.mapper.UserMapper"/>
            </mappers>
        </configuration>
        
      3. 在您的业务代码中添加以下内容。

          public static void main(String[] args) throws SQLException, IOException {
            String resource = "mybatis-config.xml";
            InputStream inputStream = Resources.getResourceAsStream(resource);
            SqlSessionFactory sqlSessionFactory =
                new SqlSessionFactoryBuilder().build(inputStream);
        
            UserService userService = new UserService(sqlSessionFactory);
            userService.run();
          }

可选配置项

通常仅配置maximumPoolSize(最大连接池大小)即可,其余配置项无需额外配置。

配置项

说明

maximumPoolSize

最大连接数量,默认值为10。您可以根据业务需求进行调整。

minimumIdle

最小空闲连接数。默认值和maximumPoolSize相同,对性能友好。如果连接数超过该值,并且连接空闲超过idleTimeout的值会断开连接。

connectionTimeout

获取连接超时时间,单位为毫秒(ms),默认值为30000,即30秒。

keepaliveTime

连接保活时间间隔,单位为毫秒(ms),默认值为60000,即1分钟。

idleTimeout

空闲连接超时时间, 单位为毫秒(ms),默认值为600000,即10分钟。

maxLifetime

连接最长生命周期,单位为毫秒(ms),默认值为1800000,即30分钟。

附录

当通过MySQL协议访问Lindorm时,如果url(连接地址)和属性文件(Properties)中均未指定以下参数, LindormDataSource将会自行填充以提升SQL访问性能。

自动填充的默认参数如下:

    ("sslMode", "DISABLED");
    ("allowPublicKeyRetrieval", "true");
    ("useServerPrepStmts", "true");
    ("useLocalSessionState", "true");
    ("rewriteBatchedStatements", "true");
    ("cachePrepStmts", "true");
    ("prepStmtCacheSize", "300");
    ("prepStmtCacheSqlLimit", "50000000");

因此,使用LindormDataSource时仅填写MySQL协议的JDBC连接地址(url)并指定目标数据库(database)即可,无需在连接串中添加连接配置。例如:jdbc:mysql://ld-uf6k8yqb741t3****-proxy-sql-lindorm-public.lindorm.rds.aliyuncs.com:33060/default