Hologres为您提供完全兼容PostgreSQL的连接(JDBC/ODBC)接口,您可以通过该接口将SQL客户端工具连接至Hologres。本文为您介绍JDBC如何连接Hologres进行数据开发。

操作步骤

  1. 下载配置。
    • 如果客户端工具默认集成了PostgreSQL数据库的驱动,直接使用工具自带的驱动即可。如果未集成驱动,请至官网下载PostgreSQL JDBC Driver,建议您使用42.2.18以上版本的JDBC。示例如下。
      <dependencies>
              <dependency>
                  <groupId>org.postgresql</groupId>
                  <artifactId>postgresql</artifactId>
                  <version>42.2.18.jre6</version> 
                                                   
              </dependency>
          </dependencies>
    • 您也可以使用Hologres特制的驱动。示例如下。
      <dependency>
        <groupId>com.alibaba.hologres</groupId>
        <artifactId>postgresql-holo</artifactId>
        <version>42.2.18.4</version>
      </dependency>
      包含如下新功能:
      • 支持通过主表写入分区表。
      • 支持yyyyMMddHHmmss型字符串写入timestamp时类型自动转换。
      • 新增若干参数,具体如下。
        参数名 说明 默认值
        dynamicPartition 当取值为true时,写入的分区子表如果不存在则自动创建。 false
        inputNumberAsEpochMsForDatetimeColumn 当取值为true时,Long型对象写入timestamp列,会将Long型对象作为epoch毫秒对待。 false
        inputStringAsEpochMsForDatetimeColumn 当取值为true时,String型对象写入 timestamp列,会将String型对象作为epoch毫秒对待。 false
  2. 连接Hologres。
    示例语句如下。
    public class HologresTest {
    
        private void jdbcExample() throws SQLException {
            String url = "jdbc:postgresql://{ENDPOINT}:{PORT}/{DBNAME}?user={ACCESS_ID}&password={ACCESS_KEY}";
            try (Connection conn = DriverManager.getConnection(url)) {
                try (Statement st = conn.createStatement()) {
                    String sql = "SELECT * FROM table where xxx limit 100";
                    try (ResultSet rs = st.executeQuery(sql)) {
                        while (rs.next()) {
                            //获取数据表中第一列数据值
                            String c1 = rs.getString(1);
                        }
                    }
                }
            }
        }
    
        private void jdbcPreparedStmtExample() throws SQLException {
            String url = "jdbc:postgresql://{ENDPOINT}:{PORT}/{DBNAME}?user={ACCESS_ID}&password={ACCESS_KEY}";
            try (Connection conn = DriverManager.getConnection(url)) {
                String sql = "insert into test values" +
                        "(?, ?), " +
                        "(?, ?), " +
                        "(?, ?), " +
                        "(?, ?), " +
                        "(?, ?), " +
                        "(?, ?), " +
                        "(?, ?), " +
                        "(?, ?), " +
                        "(?, ?), " +
                        "(?, ?)";
                try (PreparedStatement st = conn.prepareStatement(sql)) {
                    for (int i = 0; i < 10; ++i) {
                        for (int j = 0; j < 2 * 10; ++j) {
                            st.setString(j + 1, UUID.randomUUID().toString());
                        }
                        System.out.println("affected row => " + st.executeUpdate());
                    }
                }
            }
        }
     }
    更多关于Java的配置请参见文档Java配置
  3. 数据开发。
    JDBC成功连接Hologres后,您可以使用标准的开发语句进行数据开发。典型的应用场景示例如下。
  4. Druid连接池配置。
    您需使用Druid 1.1.12以上的版本连接Hologres,且连接时建议配置keepAlive=true,可以复用连接和避免短链接。配置方式如下。
    说明 其中initialSizeminIdlemaxActive请根据实例大小和实际业务进行设置。
    <bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource" init-method="init" destroy-method="close"> 
      <!-- jdbc_url是Hologres实例的连接地址URL,可以在控制台的实例配置页面获取连接URL。-->
      <property name="url" value="${jdbc_url}" />
      <!-- jdbc_user是Hologres实例中的用户账户的Access ID。 -->
      <property name="username" value="${jdbc_user}" />
      <!-- jdbc_password是Hologres实例中用户账号对应的Access Secret。 -->
      <property name="password" value="${jdbc_password}" />
      <!-- 配置初始化连接池大小、最小连接数、最大连接数。 -->
      <property name="initialSize" value="5" />
      <property name="minIdle" value="10" /> 
      <property name="maxActive" value="20" />
      <!-- 配置获取连接等待超时的时间。 -->
      <property name="maxWait" value="60000" />
      <!-- 配置间隔多久进行一次检测,检测需要关闭的空闲连接,单位毫秒。 -->
      <property name="timeBetweenEvictionRunsMillis" value="2000" />
      <!-- 配置一个连接在连接池中的最小生存时间,单位毫秒。 -->
      <property name="minEvictableIdleTimeMillis" value="600000" />
      <property name="maxEvictableIdleTimeMillis" value="900000" />
      <property name="validationQuery" value="select 1" />
      <property name="testWhileIdle" value="true" />
      <!-- 配置从连接池获取连接时,是否检查连接有效性,true每次都检查;false不检查。 -->
      <property name="testOnBorrow" value="false" />
      <!-- 配置向连接池归还连接时,是否检查连接有效性,true每次都检查;false不检查。 -->
      <property name="testOnReturn" value="false" />
      <property name="keepAlive" value="true" />
      <property name="phyMaxUseCount" value="100000" />
      <!-- 配置监控统计拦截的filters。 -->
      <property name="filters" value="stat" /> 
    </bean>