Conecte-se diretamente a uma instância do Tablestore e execute consultas SQL por meio da interface JDBC padrão com o driver com.aliyun.openservices:tablestore-jdbc.
Pré-requisitos
Um par de AccessKey (usuários RAM exigem a permissão
"Action": "ots:SQL*")Uma tabela de dados e sua tabela de mapeamento (Operações DDL)
Etapa 1: Instale o driver JDBC
O driver está disponível como uma dependência Maven ou um JAR independente.
Dependência Maven
Adicione a dependência do driver JDBC do Tablestore à seção <dependencies> do seu arquivo pom.xml do Maven. O exemplo a seguir usa a versão 5.17.0:
<dependency>
<groupId>com.aliyun.openservices</groupId>
<artifactId>tablestore-jdbc</artifactId>
<version>5.17.0</version>
</dependency>
Instalação manual
Baixe o driver JDBC do Tablestore e importe-o para o seu projeto.
Etapa 2: Use uma conexão JDBC direta
Carregue o driver, conecte-se a uma instância e execute instruções SQL.
-
Carregue o driver JDBC do Tablestore com
Class.forName().O nome da classe do driver é
com.alicloud.openservices.tablestore.jdbc.OTSDriver.Class.forName("com.alicloud.openservices.tablestore.jdbc.OTSDriver"); -
Conecte-se a uma instância do Tablestore com JDBC.
String url = "jdbc:ots:https://myinstance.cn-hangzhou.ots.aliyuncs.com/myinstance"; String user = "************************"; String password = "********************************"; Connection conn = DriverManager.getConnection(url, user, password);A tabela a seguir descreve os parâmetros de conexão.
Parâmetro
Descrição
url
A URL JDBC do Tablestore. Formato:
jdbc:ots:schema://[accessKeyId:accessKeySecret@]endpoint/instanceName[?param1=value1&...¶mN=valueN]. Os campos da URL são:-
schema (obrigatório): O protocolo. Defina este campo como https.
-
accessKeyId:accessKeySecret (opcional): O AccessKey ID e o AccessKey Secret da sua conta Alibaba Cloud ou usuário RAM.
-
endpoint (obrigatório): O endpoint da instância.
-
instanceName (obrigatório): O nome da instância.
Para outros itens de configuração, consulte Configuração.
user
O AccessKey ID da sua conta Alibaba Cloud ou usuário RAM.
password
O AccessKey Secret da sua conta Alibaba Cloud ou usuário RAM.
Forneça seu par de AccessKey e configurações por meio da URL ou de um objeto Properties. Os exemplos a seguir conectam-se à instância myinstance na região China (Hangzhou) pela Internet.
URL
DriverManager.getConnection("jdbc:ots:https://************************:********************************@myinstance.cn-hangzhou.ots.aliyuncs.com/myinstance?enableRequestCompression=true");Properties
Properties info = new Properties(); info.setProperty("user", "************************"); info.setProperty("password", "********************************"); info.setProperty("enableRequestCompression", "true"); DriverManager.getConnection("jdbc:ots:https://myinstance.cn-hangzhou.ots.aliyuncs.com/myinstance", info); -
-
Execute instruções SQL.
Utilize
createStatementouprepareStatementpara executar consultas.createStatement
String sql = "SELECT pk1, col_a FROM test_table"; Statement stmt = conn.createStatement(); ResultSet rs = stmt.executeQuery(sql); while (rs.next()) { System.out.println(rs.getString("pk1") + ", " + rs.getLong("col_a")); } rs.close(); stmt.close();prepareStatement
String sql = "SELECT * FROM test_table WHERE pk = ?"; PreparedStatement stmt = conn.prepareStatement(sql); stmt.setLong(1, 1); ResultSet rs = stmt.executeQuery(); ResultSetMetaData meta = rs.getMetaData(); while (rs.next()) { for (int i = 1; i <= meta.getColumnCount(); i++) { System.out.println(meta.getColumnName(i) + " = " + rs.getString(i)); } } rs.close(); stmt.close();
Exemplo completo
O exemplo a seguir consulta dados da tabela test_table em uma instância do Tablestore.
public class Demo {
public static void main(String[] args) throws Exception {
Class.forName("com.alicloud.openservices.tablestore.jdbc.OTSDriver");
String url = "jdbc:ots:https://myinstance.cn-hangzhou.ots.aliyuncs.com/myinstance";
String user = "************************";
String password = "********************************";
Connection conn = DriverManager.getConnection(url, user, password);
Statement stmt = conn.createStatement();
ResultSet rs = stmt.executeQuery("SELECT * FROM test_table");
ResultSetMetaData meta = rs.getMetaData();
int colCount = meta.getColumnCount();
while (rs.next()) {
for (int i = 1; i <= colCount; i++) {
System.out.print(meta.getColumnName(i) + "=" + rs.getString(i) + "\t");
}
System.out.println();
}
rs.close();
stmt.close();
conn.close();
}
}
Configuração
O driver JDBC do Tablestore é construído sobre o Java SDK e suporta configuração por meio de parâmetros de URL ou Properties.
O tempo limite no servidor para solicitações SQL é de 30 segundos. Para definir um tempo limite menor, defina syncClientWaitFutureTimeoutInMillis com um valor inferior a 30000 ou chame setQueryTimeout em cada Statement.
|
Parâmetro |
Padrão |
Descrição |
|
enableRequestCompression |
false |
Define se os dados da solicitação devem ser compactados. |
|
enableResponseCompression |
false |
Define se os dados da resposta devem ser compactados. |
|
ioThreadCount |
2 |
Número de threads IOReactor no HttpAsyncClient. |
|
maxConnections |
300 |
Quantidade máxima de conexões HTTP. |
|
socketTimeoutInMillisecond |
30000 |
Tempo limite para transferência de dados na camada de soquete. Unidade: milissegundos. Um valor de 0 indica que não há tempo limite. |
|
connectionTimeoutInMillisecond |
30000 |
Tempo limite para estabelecer uma conexão. Unidade: milissegundos. Um valor de 0 indica que não há tempo limite. |
|
retryThreadCount |
1 |
Quantidade de threads no pool de threads de nova tentativa. |
|
syncClientWaitFutureTimeoutInMillis |
-1 |
Tempo limite para espera assíncrona. Unidade: milissegundos. |
|
connectionRequestTimeoutInMillisecond |
60000 |
Tempo limite para envio de uma solicitação. Unidade: milissegundos. |
|
retryStrategy |
default |
Política de nova tentativa. Valores válidos:
|
|
retryTimeout |
10 |
Valor do tempo limite de nova tentativa e unidade de tempo. Unidades de tempo válidas:
|
|
retryTimeoutUnit |
seconds |
Conversão de tipos de dados
O Tablestore suporta cinco tipos de dados: Integer, Double, String, Binary e Boolean. O driver JDBC converte automaticamente entre tipos Java e tipos de dados do Tablestore.
De Java para Tablestore
Ao definir parâmetros SQL com PreparedStatement, o driver suporta os tipos Byte, Short, Int, Long, BigDecimal, Float, Double, String, CharacterStream, Bytes e Boolean.
PreparedStatement stmt = conn.prepareStatement("SELECT * FROM t WHERE pk = ?");
stmt.setLong(1, 1); // Supported
stmt.setURL(1, new URL("https://aliyun.com/")); // Not supported — throws an exception
De Tablestore para Java
Ao ler resultados de um ResultSet, o driver JDBC converte automaticamente os tipos de dados de acordo com as regras a seguir.
|
Tipo do Tablestore |
Regras de conversão |
|
Integer |
|
|
Double |
|
|
String |
|
|
Binary |
|
|
Boolean |
|
Statement stmt = conn.createStatement();
ResultSet rs = stmt.executeQuery("SELECT count(*) FROM t");
while (rs.next()) {
rs.getLong(1); // Supported
rs.getCharacterStream(1); // Not supported — throws an exception
}
A tabela a seguir mostra quais conversões entre tipos de dados do Tablestore e tipos Java são suportadas.
"✓" indica conversão normal, "~" indica possível exceção e "×" indica conversão não suportada.
|
Tipo |
Integer |
Double |
String |
Binary |
Boolean |
|
Byte |
~ |
~ |
~ |
~ |
✓ |
|
Short |
~ |
~ |
~ |
~ |
✓ |
|
Int |
~ |
~ |
~ |
~ |
✓ |
|
Long |
✓ |
~ |
~ |
~ |
✓ |
|
BigDecimal |
✓ |
✓ |
~ |
~ |
✓ |
|
Float |
✓ |
✓ |
~ |
~ |
✓ |
|
Double |
✓ |
✓ |
~ |
~ |
✓ |
|
String |
✓ |
✓ |
✓ |
✓ |
✓ |
|
CharacterStream |
× |
× |
✓ |
✓ |
× |
|
Bytes |
✓ |
✓ |
✓ |
✓ |
✓ |
|
Boolean |
✓ |
✓ |
✓ |
✓ |
✓ |