Utilize o Lindorm JDBC Driver para se conectar e acessar o LindormTSDB. Este guia também aborda as operações de API e os métodos suportados.
Informações básicas
O JDBC Driver para LindormTSDB implementa interfaces definidas na especificação JDBC 4.1. Por ser um banco de dados de séries temporais, o LindormTSDB suporta um subconjunto dos recursos básicos definidos no JDBC 1.0.
Pré-requisitos
Java instalado. É necessário o Java Development Kit (JDK) 1.8 ou superior.
Endereço IP do cliente adicionado à lista de permissões do Lindorm. Para mais informações, consulte Defina uma lista de permissões.
Endereço de conexão do Lindorm TSDB obtido. Para mais informações, consulte Visualize endpoints.
Procedimento
-
Instale a dependência do Lindorm JDBC Driver de uma das seguintes formas.
-
Instalação manual.
Para integrar o JDBC Driver localmente, baixe o pacote JAR em Lindorm-all-client. Selecione a versão desejada. Por exemplo, para instalar a versão 2.1.2, baixe o pacote lindorm-all-client-2.1.2.jar.
-
Baixe via Maven.
Para integrar o JDBC Driver em um projeto Maven, crie um projeto e adicione a seguinte dependência ao arquivo pom.xml:
<dependency> <groupId>com.aliyun.lindorm</groupId> <artifactId>lindorm-all-client</artifactId> <version>2.1.2</version> </dependency>NotaDefina o número da versão do lindorm-all-client conforme a versão necessária.
-
-
Acesse o LindormTSDB. Para um exemplo de código completo, consulte Exemplo de acesso.
-
Estabeleça uma conexão com o LindormTSDB.
String url = "jdbc:lindorm:tsdb:url=http://<host:port>"; Connection conn = DriverManager.getConnection(url);Notahost:port: Endereço de conexão e porta do LindormTSDB. Exemplo:ld-bp17j28j2y7pm****-proxy-tsdb.lindorm.rds.aliyuncs.com:8242.jdbc:lindorm:tsdb:url=http://<host:port>: Endereço de conexão JDBC. Para mais detalhes sobre a sintaxe e os parâmetros de conexão, consulte Detalhes do endereço de conexão JDBC.
-
Crie um banco de dados e uma tabela no LindormTSDB.
Statement stmt = conn.createStatement(); stmt.execute("CREATE DATABASE test"); stmt.execute("USE test"); stmt.execute("CREATE TABLE sensor (device_id VARCHAR TAG,region VARCHAR TAG,time TIMESTAMP,temperature DOUBLE,humidity DOUBLE,PRIMARY KEY(device_id))"); -
Insira dados na tabela sensor.
// Use PreparedStatement to write data in batches. This method is recommended. PreparedStatement pstmt = conn.prepareStatement("INSERT INTO sensor (device_id, region, time, temperature, humidity) VALUES (?, ?, ?, ?, ?)"); int batchSize = 100; long ts = System.currentTimeMillis(); for (int i = 0; i < batchSize; i++) { // Bind parameters sequentially according to the column order in the INSERT statement. pstmt.setString(1, "F07A1260"); pstmt.setString(2, "north-cn"); pstmt.setLong(3, ts + i * 10000); pstmt.setDouble(4, 12.1); pstmt.setLong(5, 45); pstmt.addBatch(); } pstmt.executeBatch(); pstmt.clearBatch(); // Write data in batches. Statement stmt = conn.createStatement(); stmt.addBatch("INSERT INTO sensor(device_id, region, time, temperature, humidity) values('F07A1260','north-cn',1619076780000,12.1,45)"); stmt.addBatch("INSERT INTO sensor(device_id, region, time, temperature, humidity) values('F07A1260','north-cn',1619076790000,13.2,47)"); stmt.addBatch("INSERT INTO sensor(device_id, region, time, temperature, humidity) values('F07A1260','north-cn',1619076800000,10.6,46)"); stmt.addBatch("INSERT INTO sensor(device_id, region, time, temperature, humidity) values('F07A1261','south-cn',1619076780000,18.1,44)"); stmt.addBatch("INSERT INTO sensor(device_id, region, time, temperature, humidity) values('F07A1261','south-cn',1619076790000,19.7,44)"); stmt.executeBatch(); stmt.clearBatch(); // Write a single data entry. This method is not recommended. Statement stmt = conn.createStatement(); stmt.execute("INSERT INTO sensor(device_id, region, time, temperature, humidity) values('F07A1260','north-cn',1619076780000,12.1,45)"); -
Consulte dados na tabela sensor.
ResultSet rs = stmt.executeQuery("select device_id, region,time,temperature,humidity from sensor where time >= 1619076780000 and time <= 1619076800000"); while (rs.next()) { String device_id = rs.getString("device_id"); String region = rs.getString("region"); Long time = rs.getLong("time"); Double temperature = rs.getDouble("temperature"); Long humidity = rs.getLong("humidity"); System.out.printf("%s %s %d %f %d\n", device_id, region, time, temperature, humidity); }
-
Operações de API e métodos suportados
A tabela a seguir lista as operações de API e os métodos suportados pelo JDBC Driver para LindormTSDB.
Operações de API não listadas na tabela abaixo possuem compatibilidade parcial com frameworks de nível superior e retornam valores padrão. Em caso de dúvidas adicionais, envie um ticket.
|
Interface |
Métodos suportados |
|
Connection |
Nota
A implementação da interface Connection do Lindorm JDBC Driver não é thread-safe. Não compartilhe o mesmo objeto Connection entre múltiplas threads. |
|
Statement |
|
|
ResultSet |
|
|
PreparedStatement |
|
Detalhes do endereço de conexão JDBC
O endereço de conexão JDBC define o protocolo e os parâmetros para conexão com o LindormTSDB.
A sintaxe do endereço de conexão JDBC é a seguinte:
jdbc:lindorm:tsdb:url=http://${host:port}[;${connection_parameter}=${connection_value}]...
host:port: Endereço de conexão e porta do LindormTSDB. Exemplo: ld-bp17j28j2y7pm****-proxy-tsdb.lindorm.rds.aliyuncs.com:8242.
A tabela a seguir descreve os parâmetros de conexão suportados:
|
Parâmetro |
Descrição |
|
user |
Nome de usuário para autenticação na instância do Lindorm. Nota
Caso a autenticação de usuário não esteja ativada no mecanismo, não é necessário especificar um nome de usuário. |
|
password |
Senha para autenticação na instância do Lindorm. Se você esquecer a senha, altere-a no sistema de gerenciamento de cluster do LindormTable. Para mais informações, consulte Alterar senha de usuário. Nota
Caso a autenticação de usuário não esteja ativada no mecanismo, não é necessário especificar uma senha. |
|
database |
Banco de dados a ser acessado. Se este parâmetro não for especificado, o banco de dados |
|
lindorm.tsdb.driver.connect.timeout |
Tempo limite para conexão com o servidor LindormTSDB, em milissegundos (ms). O valor padrão é 60 segundos (60.000 ms). |
|
lindorm.tsdb.driver.socket.timeout |
Tempo limite para intervalos de leitura e escrita do socket, em milissegundos (ms). O valor padrão é -1, indicando ausência de tempo limite. |
Para otimizar a utilização de recursos, o servidor desconecta ativamente a conexão caso o cliente Lindorm permaneça ocioso por 60 minutos. Ao tentar reutilizar essa conexão, ocorrerá o erro com.aliyun.lindorm.client.shaded.org.apache.calcite.avatica.http.ConnectionDisconnectedException. Para resolver esse problema, restabeleça a conexão.
Uso do pool de conexões Druid para acessar o LindormTSDB
Aplicações Java que acessam o LindormTSDB via JDBC Driver criam um objeto Connection para cada conexão, o que gera uma sobrecarga significativa. Um pool de conexões reduz essa sobrecarga ao reutilizar conexões existentes.
Os passos a seguir descrevem como utilizar o pool de conexões Alibaba Druid.
-
Adicione a dependência do pool de conexões Druid ao arquivo pom.xml do seu projeto Maven:
<dependency> <groupId>com.alibaba</groupId> <artifactId>druid</artifactId> <version>1.2.6</version> </dependency> Adicione a dependência do Lindorm JDBC Driver ao seu projeto Maven. Para mais informações, consulte a Etapa 1 em Procedimento.
-
Execute o código abaixo para criar um objeto DataSource e definir o endereço de conexão JDBC do LindormTSDB para o DataSource.
dataSource = new DruidDataSource(); try { dataSource.setDriver(DriverManager.getDriver("jdbc:lindorm:tsdb:url=http://<host:port>")); } catch (SQLException throwables) { throwables.printStackTrace(); }Notahost:port: Endereço de conexão e porta do LindormTSDB. Exemplo:ld-bp17j28j2y7pm****-proxy-tsdb.lindorm.rds.aliyuncs.com:8242. -
Crie uma Connection JDBC a partir do DataSource e acesse o LindormTSDB. O código completo é apresentado a seguir:
import com.alibaba.druid.pool.DruidDataSource; import java.sql.*; public class App { private DruidDataSource dataSource; public void setUp() { dataSource = new DruidDataSource(); try { dataSource.setDriver(DriverManager.getDriver("jdbc:lindorm:tsdb:url=http://ld-bp17j28j2y7pm****-proxy-tsdb-pub.lindorm.rds.aliyuncs.com:8242")); } catch (SQLException throwables) { throwables.printStackTrace(); } dataSource.setUrl("jdbc:lindorm:tsdb:url=http://ld-bp17j28j2y7pm****-proxy-tsdb-pub.lindorm.rds.aliyuncs.com:8242"); dataSource.setValidationQuery("select 1"); dataSource.setMaxActive(1); dataSource.setUsername("username"); dataSource.setPassword("****"); dataSource.setKeepAlive(true); dataSource.setMinEvictableIdleTimeMillis(80); dataSource.setMaxWait(10000); dataSource.init(); } public void close() { dataSource.close(); } public void testQuery() { try (Connection conn = this.dataSource.getConnection()) { try (Statement stmt = conn.createStatement()) { ResultSet rs = stmt.executeQuery("select * from sensor"); long count = 0; while (rs.next()) { count++; } System.out.println("count=" + count + " "); } catch (RuntimeException e) { e.printStackTrace(); } catch (SQLException e) { e.printStackTrace(); } } catch (RuntimeException e) { System.out.println("connection failed."); e.printStackTrace(); } catch (SQLException e) { e.printStackTrace(); } } public static void main( String[] args ) { App app = new App(); app.setUp(); app.testQuery(); app.close(); } }