Usar o driver JDBC para BigQuery

O driver Java Database Connectivity (JDBC) para BigQuery conecta seus aplicativos Java ao BigQuery, permitindo que você use os recursos do BigQuery com as ferramentas e a infraestrutura de sua preferência. Para conectar aplicativos que não são Java ao BigQuery, use o driver Open Database Connectivity (ODBC) para BigQuery.

Limitações

O driver JDBC para BigQuery está sujeito às seguintes limitações:

Antes de começar

  1. Verifique se você conhece os drivers JDBC, o Apache Maven e o pacote java.sql.
  2. Verifique se o sistema está configurado com o Java Runtime Environment (JRE) 8.0 ou mais recente. Para saber como verificar sua versão do JRE, consulte Como verificar o ambiente do JRE.
  3. Autentique-se no BigQuery e anote as informações a seguir, que serão usadas posteriormente quando você estabelecer uma conexão com o driver JDBC para BigQuery. Você só precisa anotar as informações que correspondem ao método de autenticação que você usa.

    Método de autenticação Informações de autenticação Exemplo Propriedade de conexão (para definir mais tarde)
    Conta de serviço padrão E-mail da conta de serviço bq-jdbc-sa@mytestproject.s3ns.iam.gserviceaccount.com OAuthServiceAcctEmail
    Chave da conta de serviço (objeto JSON) my-sa-key OAuthPvtKey
    Arquivo de chave da conta de serviço Arquivo de chave da conta de serviço (caminho completo) path/to/file/secret.json OAuthPvtKeyPath
    Conta de usuário do Google ID do cliente 123-abc.apps.googleusercontent.com OAuthClientId
    Chave secreta do cliente _aB-C1D_E2fGh3Ij4kL5m6No7p8QR9sT0uV OAuthClientSecret
    Token de acesso pré-gerado Token de acesso ya29.a0AfH6SMCiH1L-x_yZ OAuthAccessToken
    Token de atualização pré-gerado Token de atualização 1/fFAGRNJru1FTz70BzhT3Zg OAuthRefreshToken
    ID do cliente 123-abc.apps.googleusercontent.com OAuthClientId
    Chave secreta do cliente _aB-C1D_E2fGh3Ij4kL5m6No7p8QR9sT0uV OAuthClientSecret
    Application Default Credentials Nenhum N/A N/A
    Arquivo de configuração Arquivo de configuração (objeto JSON ou caminho completo) path/to/file/secret.json OAuthPvtKey
    Objeto de configuração de conta externa Objeto de configuração da conta external_account_configuration_object OAuthPvtKey
    Outro Propriedade de público-alvo do arquivo de configuração da conta externa //iam.googleapis.com/projects/my-project/locations/US-EAST1/workloadIdentityPools/my-pool-/providers/my-provider BYOID_AudienceUri
    Recuperação de token e arquivo de informações ambientais {\"file\":\"/path/to/file\"} BYOID_CredentialSource
    Projeto do usuário (somente se estiver usando um pool de força de trabalho) my_project BYOID_PoolUserProject
    URI para identidade temporária de conta de serviço (somente se estiver usando um pool de colaboradores) my-sa BYOID_SA_Impersonation_Uri
    Token do Security Token Service com base na especificação de troca de tokens urn:ietf:params:oauth:tokentype:id_token BYOID_SubjectTokenType
    Endpoint de troca de tokens do Security Token Service https://sts.googleapis.com/v1/token BYOID_TokenUri

Instalar e configurar o driver JDBC

É possível instalar e configurar o driver JDBC para o BigQuery fazendo o download direto do arquivo uber-JAR ou usando o Maven.

Configuração de download direto

Para configurar o driver JDBC por download direto, faça o seguinte:

  1. Faça o download da versão 1.6.0 do driver.
  2. Copie o arquivo baixado para o local especificado pelo software.

Para informações sobre mudanças de recursos e atualizações de fluxo de trabalho, consulte o registro de alterações.

Configuração do Maven

O driver JDBC para BigQuery está disponível no Maven Central.

Para configurar o ambiente de desenvolvimento com o driver JDBC, adicione o driver como uma dependência ao projeto:

Maven

Adicione a seguinte dependência ao arquivo pom.xml:

<dependency>
    <groupId>com.google.cloud</groupId>
    <artifactId>google-cloud-bigquery-jdbc</artifactId>
    <version>1.6.0</version>
</dependency>

Maven usando uber-JAR

Adicione a seguinte dependência ao arquivo pom.xml:

<dependency>
    <groupId>com.google.cloud</groupId>
    <artifactId>google-cloud-bigquery-jdbc</artifactId>
    <version>1.6.0</version>
    <classifier>all</classifier>
    <exclusions>
      <exclusion>
        <groupId>*</groupId>
        <artifactId>*</artifactId>
      </exclusion>
    </exclusions>
</dependency>

Gradle

Adicione a instrução a seguir ao seu arquivo build.gradle:

dependencies {
// ... other dependencies
implementation("com.google.cloud:google-cloud-bigquery-jdbc:1.6.0")
}

Estabelecer uma conexão

Para estabelecer uma conexão entre o aplicativo Java e o BigQuery com o driver JDBC para BigQuery, faça o seguinte:

  1. Identifique sua string de conexão para o driver JDBC do BigQuery. Essa string captura todas as informações necessárias para estabelecer uma conexão entre o aplicativo Java e o BigQuery. A string de conexão tem o seguinte formato:

    jdbc:bigquery://HOST:PORT;ProjectId=PROJECT_ID;OAuthType=AUTH_TYPE;AUTH_PROPS;OTHER_PROPS

    Substitua:

    • HOST: o DNS ou o endereço IP do servidor.
    • PORT: o número da porta TCP.
    • PROJECT_ID: o ID do projeto do BigQuery.
    • AUTH_TYPE: um número que especifica o tipo de autenticação que você usou. Uma das seguintes opções:
      • 0: para autenticação de conta de serviço (padrão e arquivo de chave)
      • 1: para autenticação da Conta do Google do usuário
      • 2: para autenticação de token de acesso ou atualização pré-gerado.
      • 3: para autenticação do Application Default Credentials
      • 4: para outros métodos de autenticação
    • AUTH_PROPS: as informações de autenticação que você anotou ao autenticar no BigQuery, listadas no formato property_1=value_1; property_2=value_2;.... Por exemplo, OAuthPvtKeyPath=path/to/file/secret.json, se você tiver feito a autenticação com um arquivo de chave de conta de serviço.
    • OTHER_PROPS (opcional): propriedades de conexão adicionais para o driver JDBC, listadas no formato property_1=value_1; property_2=value_2;.... Para uma lista completa de propriedades de conexão, consulte Propriedades de conexão.
  2. Conecte seu aplicativo Java ao driver JDBC do BigQuery com a classe DriverManager ou DataSource.

    • Conecte-se com a classe DriverManager:

      import java.sql.Connection;
      import java.sql.DriverManager;
      
      private static Connection getJdbcConnectionDM(){
        Connection connection = DriverManager.getConnection(CONNECTION_STRING);
        return connection;
      }

      Substitua CONNECTION_STRING pela string de conexão da etapa anterior.

    • Conecte-se com a classe DataSource:

      import com.google.cloud.bigquery.jdbc.DataSource;
      import java.sql.Connection;
      import java.sql.SQLException;
      
      private static public Connection getJdbcConnectionDS() throws SQLException {
        Connection connection = null;
        DataSource dataSource = new com.google.cloud.bigquery.jdbc.DataSource();
        dataSource.setURL(CONNECTION_STRING);
        connection = dataSource.getConnection();
        return connection;
      }

      Substitua CONNECTION_STRING pela string de conexão da etapa anterior.

      A classe DataSource também tem métodos setter que podem ser usados para definir propriedades de conexão, em vez de incluí-las na string de conexão. Confira o seguinte exemplo:

      private static Connection getConnection() throws SQLException {
        DataSource ds = new DataSource();
        ds.setURL(jdbc:bigquery://https://www.googleapis.com/bigquery/v2:443;);
        ds.setAuthType(3);  // Application Default Credentials
        ds.setProjectId("MyTestProject");
        ds.setEnableHighThroughputAPI(true);
        ds.setLogLevel("6");
        ds.setUseQueryCache(false);
        return ds.getConnection();
      }

Propriedades da conexão

As propriedades de conexão do driver JDBC são parâmetros de configuração que você inclui na string de conexão ou transmite por métodos setter ao estabelecer uma conexão com um banco de dados. As seguintes propriedades de conexão são compatíveis com o driver JDBC para BigQuery.

Propriedade de conexão Descrição Valor padrão Tipo de dado Obrigatório
AdditionalProjects Projetos que o driver pode acessar para consultas e operações de metadados, além do projeto principal definido pela propriedade ProjectId. N/A String separada por vírgulas Não
AllowLargeResults Determina se o driver processa resultados de consulta maiores que 128 MB quando a propriedade QueryDialect está definida como BIG_QUERY. Se a propriedade QueryDialect estiver definida como SQL, o driver sempre processará resultados de consulta grandes. TRUE Booleano Não
BYOID_AudienceUri A propriedade de público-alvo em um arquivo de configuração de conta externa. A propriedade de público-alvo pode conter o nome do recurso do pool de identidades de carga de trabalho ou do pool de colaboradores, bem como o identificador do provedor nesse pool. N/A String Somente quando OAuthType=4
BYOID_CredentialSource A recuperação de tokens e as informações ambientais. N/A String Somente quando OAuthType=4
BYOID_PoolUserProject O projeto do usuário quando um pool de colaboradores está sendo usado para autenticação. N/A String Somente quando OAuthType=4 e usando o pool de força de trabalho
BYOID_SA_Impersonation_Uri O URI para a identidade temporária de conta de serviço quando um pool de colaboradores está sendo usado para autenticação. N/A String Somente quando OAuthType=4 e usando o pool de força de trabalho
BYOID_SubjectTokenType O token do Security Token Service com base na especificação de troca de tokens. Uma das seguintes opções:
  • urn:ietf:params:oauth:token-type:jwt
  • urn:ietf:params:oauth:token-type:id_token
  • urn:ietf:params:oauth:token-type:saml2
  • urn:ietf:params:aws:token-type:aws4_request
urn:ietf:params:oauth:tokentype:id_token String Somente quando OAuthType=4
BYOID_TokenUri O endpoint de troca de tokens do Security Token Service. https://sts.googleapis.com/v1/token String Não
ConnectionPoolSize O tamanho do pool de conexões, se o agrupamento de conexões estiver ativado. 10 Longo Não
DefaultDataset O conjunto de dados usado quando não é especificado um em uma consulta. N/A String Não
EnableGcpLogExporter Determina se o driver exporta automaticamente os registros para o Cloud Logging (se nenhuma instância personalizada ou global do OpenTelemetry for usada). Para mais informações, consulte OpenTelemetry. FALSE Booleano Não
EnableGcpTraceExporter Determina se o driver exporta traces automaticamente para o Cloud Trace (se nenhuma instância personalizada ou global do OpenTelemetry for usada). Para mais informações, consulte OpenTelemetry. FALSE Booleano Não
EnableHighThroughputAPI Determina se a API Storage Read pode ser usada. As propriedades HighThroughputActivationRatio e HighThroughputMinTableSize também precisam ser definidas como TRUE para usar a API Storage Read. FALSE Booleano Não
EnableProjectDiscovery Determina se os métodos de metadados do banco de dados descobrem conjuntos de dados em todos os projetos do Cloud de Confiance acessíveis. Quando definido como FALSE, a descoberta é restrita ao ProjectId padrão. FALSE Booleano Não
EnableSession Determina se a conexão inicia uma sessão. Se definido como TRUE, o ID da sessão será transmitido para todas as consultas subsequentes. FALSE Booleano Não
EnableTimestampPicos Determina se o driver recupera valores TIMESTAMP(12) com precisão de picossegundos. Quando definido como TRUE, os valores TIMESTAMP(12) são retornados como objetos String formatados em UTC pelos métodos getString() e getObject(). Quando definido como FALSE, os valores de TIMESTAMP(12) são truncados para uma precisão de microssegundos de seis dígitos. Essa propriedade não é compatível com o SQL legado (QueryDialect=BIG_QUERY). FALSE Booleano Não
EnableWriteAPI Determina se a API Storage Write (gRPC) pode ser usada. Ele precisa ser definido como TRUE para ativar as inserções em massa. FALSE Booleano Não
EndpointOverrides Endpoints personalizados para substituir o seguinte:
  • BIGQUERY=https://bigquery.googleapis.com
  • READ_API=https://bigquerystorage.googleapis.com
  • OAUTH2=https://oauth2.googleapis.com
  • STS=https://sts.googleapis.com
N/A String separada por vírgulas Não
FilterTablesOnDefaultDataset Determina o escopo dos metadados retornados pelos métodos DatabaseMetaData.getTables() e DatabaseMetaData.getColumns(). Quando definido como FALSE, nenhuma filtragem ocorre. A propriedade DefaultDataset também precisa ser definida para ativar a filtragem. FALSE Booleano Não
GcpTelemetryCredentials As credenciais usadas para autenticar exportadores de telemetria. Aceita um caminho para uma chave JSON de conta de serviço ou a string JSON bruta. O padrão será as credenciais de conexão se não for definido. Para mais informações, consulte OpenTelemetry. N/A String Não
GcpTelemetryProjectId O ID do projeto de destino do Cloud de Confiance by S3NS para telemetria. O padrão é o ProjectId principal. Para mais informações, consulte OpenTelemetry. N/A String Não
HighThroughputActivationRatio O limite para o número de páginas em uma resposta de consulta. Quando esse número é excedido e as condições EnableHighThroughputAPI e HighThroughputMinTableSize são atendidas, o driver começa a usar a API Storage Read. 2 Inteiro Não
HighThroughputMinTableSize O limite para o número de linhas em uma resposta de consulta. Quando esse número é excedido e as condições EnableHighThroughputAPI e HighThroughputActivationRatio são atendidas, o driver começa a usar a API Storage Read. 10000 Inteiro Não
JobCreationMode Determina se as consultas são executadas com ou sem jobs. Um valor 1 significa que os jobs são criados para cada consulta, e um valor 2 significa que as consultas podem ser executadas sem jobs. 2 Inteiro Não
JobTimeout O tempo limite do job (em segundos) após o qual o job é cancelado no servidor. 0 Longo Não
KMSKeyName O nome da chave do KMS para criptografar dados. N/A String Não
Labels Rótulos associados à consulta para organizar e agrupar jobs de consulta. N/A Map<String, String> Não
LargeResultDataset O conjunto de dados de destino para resultados de consultas grandes, somente quando a propriedade LargeResultTable está definida. Quando você define essa propriedade, as gravações de dados ignoram o cache de resultados e acionam o faturamento para cada consulta, mesmo que os resultados sejam pequenos. _google_jdbc String Não
LargeResultsDatasetExpirationTime O ciclo de vida de todas as tabelas em um grande conjunto de dados de resultados, em milissegundos. Essa propriedade será ignorada se o conjunto de dados já tiver um tempo de expiração padrão definido. 3600000 Longo Não
LargeResultTable A tabela de destino para resultados de consultas grandes, somente quando a propriedade LargeResultDataset está definida. Quando você define essa propriedade, as gravações de dados ignoram o cache de resultados e acionam o faturamento de cada consulta, mesmo que os resultados sejam pequenos. temp_table... String Não
ListenerPoolSize O tamanho do pool de listeners, se o pool de conexões estiver ativado. 10 Longo Não
Location O local em que os conjuntos de dados são criados ou consultados. O BigQuery determina automaticamente o local se essa propriedade não estiver definida. N/A String Não
LogLevel O nível de detalhe registrado pelo driver. Para mais informações, consulte Logging. 0 Inteiro Não
LogPath O diretório em que os arquivos de registro são gravados. N/A String Não
MaximumBytesBilled O limite de bytes faturados. As consultas com bytes faturados maiores que esse número falham sem gerar cobranças. 0 Longo Não
MaxResults O número máximo de resultados por página. 10000 Longo Não
MetaDataFetchThreadCount O número de linhas de execução usadas para métodos de metadados do banco de dados. 32 Inteiro Não
OAuthAccessToken O token de acesso usado para autenticação de token de acesso pré-gerado. N/A String Somente quando OAUTH_TYPE=2
OAuthClientId O ID do cliente para autenticação de token de atualização pré-gerado e autenticação de conta de usuário. N/A String Somente quando OAUTH_TYPE=1 ou OAUTH_TYPE=2
OAuthClientSecret A chave secreta do cliente para autenticação de token de atualização pré-gerado e autenticação de conta de usuário. N/A String Somente quando OAUTH_TYPE=1 ou OAUTH_TYPE=2
OAuthP12Password A senha do arquivo de chave PKCS12. notasecret String Não
OAuthPvtKey A chave da conta de serviço ao usar a autenticação da conta de serviço. Esse valor pode ser um objeto de arquivo de chave JSON bruto ou um caminho para o arquivo de chave JSON. N/A String Somente quando OAUTH_TYPE=0 e o valor OAuthPvtKeyPath não estão definidos
OAuthPvtKeyPath O caminho para a chave da conta de serviço ao usar a autenticação da conta de serviço. N/A String Somente quando OAUTH_TYPE=0 e os valores OAuthPvtKey e OAuthServiceAcctEmail não estão definidos
OAuthRefreshToken O token de atualização para autenticação de token de atualização pré-gerado. N/A String Somente quando OAUTH_TYPE=2
OAuthServiceAcctEmail O e-mail da conta de serviço ao usar a autenticação da conta de serviço. N/A String Somente quando OAUTH_TYPE=0 e o valor OAuthPvtKeyPath não estão definidos
OAuthType O tipo de autenticação. Uma das seguintes opções:
  • 0: autenticação da conta de serviço
  • 1: autenticação da conta de usuário
  • 2: autenticação de token de acesso ou atualização pré-gerada.
  • 3: autenticação do Application Default Credentials
  • 4: outros métodos de autenticação
-1 Inteiro Sim
PartnerToken Um token usado pelos parceiros do Cloud de Confiance para rastrear o uso do driver. N/A String Não
ProjectId O ID do projeto padrão para o driver. Esse projeto é usado para executar consultas e é cobrado pelo uso de recursos. Se não for definido, o driver vai inferir um ID do projeto. N/A String Não, mas é altamente recomendável
ProxyHost O nome do host ou o endereço IP de um servidor proxy pelo qual a conexão JDBC é roteada. N/A String Não
ProxyPort O número da porta em que o servidor proxy está detectando conexões. N/A String Não
ProxyPwd A senha de autenticação ao se conectar por um servidor proxy que a exige. N/A String Não
ProxyUid O nome de usuário para autenticação ao se conectar por um servidor proxy que exige isso. N/A String Não
QueryDialect O dialeto SQL para execução de consultas. Use SQL para GoogleSQL (altamente recomendado) e BIG_QUERY para SQL legado. SQL String Não
QueryProperties Propriedades de conexão REST que personalizam o comportamento da consulta. N/A Map<String, String> Não
RequestGoogleDriveScope Adiciona o escopo somente leitura do Drive à conexão quando definido como 1. 0 Inteiro Não
RetryInitialDelay Define o atraso (em segundos) antes da primeira nova tentativa. 0 Longo Não
RetryMaxDelay Define o limite máximo (em segundos) para o atraso de nova tentativa. 0 Longo Não
ServiceAccountImpersonationChain Uma lista separada por vírgulas de e-mails de conta de serviço na cadeia de representação. N/A String Não
ServiceAccountImpersonationEmail O e-mail da conta de serviço a ser representada. N/A String Não
ServiceAccountImpersonationScopes Uma lista separada por vírgulas de escopos do OAuth2 para usar com a conta personificada. https://www.googleapis.com/auth/bigquery String Não
ServiceAccountImpersonationTokenLifetime A vida útil do token da conta representada (em segundos). 3600 Inteiro Não
SSLTrustStore O caminho completo para o TrustStore do Java que contém certificados de autoridade certificadora (CA) confiáveis. O driver usa esse truststore para validar a identidade do servidor durante o handshake de SSL/TLS. N/A String Não
SSLTrustStoreProvider O provedor da extensão de criptografia Java (JCE, na sigla em inglês) usado para a propriedade SSLTrustStore. N/A String Não
SSLTrustStorePwd A senha do Java TrustStore especificada na propriedade SSLTrustStore. N/A String Somente se o TrustStore do Java estiver protegido por senha
SSLTrustStoreType O formato do arquivo de truststore especificado na propriedade SSLTrustStore (como JKS, PKCS12 ou ROTKS). N/A String Não
SWA_ActivationRowCount O limite de linhas executeBatch insert que, quando excedido, faz com que o conector mude para a API Storage Write (gRPC). 3 Inteiro Não
SWA_AppendRowCount O tamanho do stream de gravação. 1000 Inteiro Não
Timeout O período, em segundos, em que o conector tenta novamente uma chamada de API com falha antes de atingir o tempo limite. 0 Longo Não
UniverseDomain O domínio de nível superior associado aos recursos do Cloud de Confiance da sua organização. googleapis.com String Não
UnsupportedHTAPIFallback Determina se o conector volta para a API REST (quando definido como TRUE) ou retorna um erro (quando definido como FALSE). TRUE Booleano Não
UseGlobalOpenTelemetry Determina se o driver usa GlobalOpenTelemetry.get() para instrumentação. Para mais informações, consulte OpenTelemetry. FALSE Booleano Não
UseQueryCache Ativa o armazenamento em cache de consultas. TRUE Booleano Não

Executar consultas com o driver

Com o aplicativo Java conectado ao BigQuery pelo driver JDBC, agora é possível executar consultas no ambiente de desenvolvimento usando o processo JDBC padrão. Todas as cotas e limites do BigQuery se aplicam.

Mapeamento de tipo de dados

Quando você executa consultas pelo driver JDBC para o BigQuery, ocorre o seguinte mapeamento de tipo de dados:

Tipo do GoogleSQL Tipo Java
ARRAY Array
BIGNUMERIC BigDecimal
BOOL Boolean
BYTES byte[]
DATE Date
DATETIME String
FLOAT64 Double
GEOGRAPHY String
INT64 Long
INTERVAL String
JSON String
NUMERIC BigDecimal
STRING String
STRUCT Struct
TIME Time
TIMESTAMP Timestamp

Exemplos

As seções a seguir mostram exemplos que usam recursos do BigQuery com o driver JDBC para BigQuery.

Parâmetros posicionais

O exemplo a seguir executa uma consulta com um parâmetro posicional:

PreparedStatement preparedStatement = connection.prepareStatement(
    "SELECT * FROM MyTestTable where testColumn = ?");
preparedStatement.setString(1, "string2");
ResultSet resultSet = statement.executeQuery(selectQuery);

Registros aninhados e repetidos

O exemplo a seguir consulta o registro base de dados de Struct:

ResultSet resultSet = statement.executeQuery("SELECT STRUCT(\"Adam\" as name, 5 as age)");
    resultSet.next();
    Struct obj = (Struct) resultSet.getObject(1);
    System.out.println(obj.toString());

O driver retorna o registro base como um objeto struct ou uma representação de string de um objeto JSON. O resultado será semelhante ao seguinte:

{
  "v": {
    "f": [
      {
        "v": "Adam"
      },
      {
        "v": "5"
      }
    ]
  }
}

O exemplo a seguir consulta os subcomponentes de um objeto Struct:

ResultSet resultSet = statement.executeQuery("SELECT STRUCT(\"Adam\" as name, 5 as age)");
    resultSet.next();
    Struct structObject = (Struct) resultSet.getObject(1);
    Object[] structComponents = structObject.getAttributes();
    for (Object component : structComponents){
      System.out.println(component.toString());
    }

O exemplo a seguir consulta uma matriz padrão de dados repetidos e, em seguida, verifica o resultado:

// Execute Query
ResultSet resultSet = statement.executeQuery("SELECT [1,2,3]");
resultSet.next();
Object[] arrayObject = (Object[]) resultSet.getArray(1).getArray();

// Verify Result
int count =0;
for (; count < arrayObject.length; count++) {
  System.out.println(arrayObject[count]);
}

O exemplo a seguir consulta uma matriz Struct de dados repetidos e, em seguida, verifica o resultado:

// Execute Query
ResultSet resultSet = statement.executeQuery("SELECT "
    + "[STRUCT(\"Adam\" as name, 12 as age), "
    + "STRUCT(\"Lily\" as name, 17 as age)]");

Struct[] arrayObject = (Struct[]) resultSet.getArray(1).getArray();

// Verify Result
for (int count =0; count < arrayObject.length; count++) {
  System.out.println(arrayObject[count]);
}

Inserção em massa

O exemplo a seguir executa uma operação de inserção em massa com o método executeBatch.

Connection conn = DriverManager.getConnection(connectionUrl);
PreparedStatement statement = null;
Statement st = conn.createStatement();
final String insertQuery = String.format(
        "INSERT INTO `%s.%s.%s` "
      + " (StringField, IntegerField, BooleanField) VALUES(?, ?, ?);",
        DEFAULT_CATALOG, DATASET, TABLE_NAME);

statement = conn.prepareStatement(insertQuery1);

for (int i=0; i<2000; ++i) {
      statement.setString(1, i+"StringField");
      statement.setInt(2, i);
      statement.setBoolean(3, true);
      statement.addBatch();
}

statement.executeBatch();

Logging

Para resolver problemas com o driver JDBC para BigQuery, ative a geração de registros definindo propriedades de conexão ou variáveis de ambiente. A geração de registros pode afetar o desempenho e ocupar espaço em disco. Por isso, ative-a apenas temporariamente para capturar um problema.

Níveis de registro

A propriedade LogLevel determina o nível de detalhe registrado pelo pacote java.util.logging:

  • 0: OFF (padrão)
  • 1: SEVERE
  • 2: WARNING
  • 3: INFO
  • 4: CONFIG
  • 5: FINE
  • 6: FINER
  • 7: FINEST
  • 8: ALL

Recomendamos o nível 6 para solução de problemas gerais. Os níveis 7 e 8 são limitados a operações ResultSet e geram um grande volume de registros.

Ativar a geração de registros na string de conexão

Para ativar a geração de registros na string de conexão, adicione as propriedades de conexão LogLevel e LogPath, por exemplo:

jdbc:bigquery://https://www.googleapis.com/bigquery/v2:443;ProjectId=MyTestProject;OAuthType=3;LogLevel=6;LogPath=/tmp/jdbc-logs;

Ativar a geração de registros com variáveis de ambiente

Se a ferramenta para desenvolvedores não permitir edições de string de conexão, você também poderá definir o nível e o caminho do registro com as seguintes variáveis de ambiente antes de executar o aplicativo:

  • BIGQUERY_JDBC_LOG_LEVEL: o nível do registro (0 a 8).
  • BIGQUERY_JDBC_LOG_PATH: o diretório dos arquivos de registro.

Por exemplo, em um ambiente Linux ou macOS, execute o seguinte:

export BIGQUERY_JDBC_LOG_LEVEL=6
export BIGQUERY_JDBC_LOG_PATH=/tmp/jdbc-logs

OpenTelemetry

O driver JDBC para BigQuery é compatível com o OpenTelemetry (OTel) para fornecer rastreamento e geração de registros distribuídos, o que permite monitorar o desempenho das interações do banco de dados e resolver problemas de maneira eficaz.

Operações rastreadas

Quando o OpenTelemetry está ativado, o driver gera períodos para as seguintes operações:

  • Execução de consulta: os períodos são gerados para BigQueryStatement (execute(), executeQuery(), executeLargeUpdate(), executeBatch()) e BigQueryPreparedStatement (execute(), executeQuery(), executeLargeUpdate()).
  • Operações de metadados: os períodos são gerados para métodos DatabaseMetaData específicos (getCatalogs(), getSchemas(), getTables(), getColumns()).
  • Paginação: as buscas assíncronas de outras páginas de resultados (ao usar o caminho da API REST) são rastreadas e vinculadas causalmente ao período de execução da consulta original usando os links de período do OpenTelemetry. Um período chamado BigQueryStatement.pagination é criado para essas operações.
  • Propagação de contexto: o driver JDBC propaga o contexto ativo para o SDK do google-cloud-bigquery. Como resultado, os períodos gerados pelo SDK (como chamadas RPC HTTP) aparecem automaticamente como filhos dos períodos do JDBC, fornecendo uma hierarquia de trace completa de ponta a ponta.

Modos de configuração

É possível configurar o OpenTelemetry no driver JDBC usando um dos seguintes modos, dependendo da arquitetura e dos requisitos do aplicativo.

Telemetria gerenciada por aplicativo

Se o aplicativo já usa o OpenTelemetry, é possível injetar a instância do OpenTelemetry no driver JDBC para garantir que a telemetria do driver esteja correlacionada com a telemetria do aplicativo.

Para isso, use a API BigQueryDataSource:

BigQueryDataSource dataSource = new BigQueryDataSource();
// ... set other properties ...
dataSource.setCustomOpenTelemetry(yourOpenTelemetryInstance);

Suporte global ao OpenTelemetry

Se você inicializou o OpenTelemetry globalmente no aplicativo (por exemplo, usando o agente Java do OpenTelemetry ou chamando a função GlobalOpenTelemetry.set()), é possível configurar o driver para usar essa instância global.

Para ativar a instância global, defina a propriedade de conexão UseGlobalOpenTelemetry como TRUE.

Telemetria Cloud de Confiance sem configuração

Se você estiver executando no Cloud de Confiance e quiser uma configuração rápida, ative a exportação automática de traces e registros para a observabilidade do Cloud de Confiance (Trace e Logging).

Para ativar essa exportação, defina as seguintes propriedades de conexão no URL JDBC:

  • EnableGcpTraceExporter=true
  • EnableGcpLogExporter=true

Veja a seguir um exemplo de URL de conexão:

jdbc:bigquery://https://www.googleapis.com/bigquery/v2:443;ProjectId=your-project-id;EnableGcpTraceExporter=true;EnableGcpLogExporter=true;

Propriedades da conexão do OpenTelemetry

As propriedades de conexão a seguir são compatíveis com o OpenTelemetry. Para descrições detalhadas e valores padrão, consulte Propriedades de conexão.

  • EnableGcpLogExporter
  • EnableGcpTraceExporter
  • GcpTelemetryCredentials
  • GcpTelemetryProjectId
  • UseGlobalOpenTelemetry

Considerações importantes

Ao implantar a integração do OpenTelemetry, lembre-se das seguintes considerações sobre o comportamento de geração de registros, a autenticação, a configuração de proxy e os preços.

Interação com LogLevel

A propriedade de conexão LogLevel atual atua como um guardião principal para a geração de registros.

  • Se LogLevel=0 (OFF) estiver definido, nenhum registro será gerado. Consequentemente, nenhum registro é exportado usando o OpenTelemetry ou para o Logging, mesmo que EnableGcpLogExporter=true.
  • Para ativar a geração de registros do OTel, verifique se LogLevel está definido como um valor maior que 0 (por exemplo, 5 para registros detalhados).

Autenticação para telemetria

A exportação de telemetria (rastreamento e geração de registros) com o fallback automático Cloud de Confiance é compatível com o Application Default Credentials (ADC) e com as credenciais explícitas da conta de serviço fornecidas usando GcpTelemetryCredentials.

Quando GcpTelemetryProjectId ou GcpTelemetryCredentials são fornecidos, os registros e os traces são enviados para o mesmo projeto de destino especificado usando as mesmas credenciais configuradas.

Configuração de proxy com OpenTelemetry e geração de registros

Se o aplicativo se conectar ao BigQuery por um servidor proxy, o driver vai processar o roteamento de proxy da seguinte maneira:

  • Exportação de trace (HTTP). Quando você usa o protocolo HTTP padrão para exportação de traces do OpenTelemetry (otel.exporter.otlp.protocol=http/protobuf), o driver roteia automaticamente o tráfego de exportação de traces pelo proxy configurado nas propriedades de conexão usando ProxyHost e ProxyPort.
  • Exportação de registros e telemetria gRPC. O exportador de registros automático do Cloud de Confiance (EnableGcpLogExporter=true) e os exportadores do OpenTelemetry baseados em gRPC (otel.exporter.otlp.protocol=grpc) usam gRPC, que não oferece suporte à configuração de proxy por conexão. Para rotear o tráfego de exportação de registros e telemetria gRPC por um servidor proxy, defina as configurações de proxy no nível da JVM usando as seguintes propriedades do sistema:

    -Dhttps.proxyHost=PROXY_HOST -Dhttps.proxyPort=PROXY_PORT

APIs e permissões do IAM necessárias

Para gravar dados de telemetria na observabilidade do Cloud de Confiance by S3NS , faça a seguinte configuração no projeto de destino do Cloud de Confiance :

  1. Ative as APIs:
    • Ative a API Cloud Trace (cloudtrace.googleapis.com).
    • Ative a API Cloud Logging (logging.googleapis.com).
  2. Conceda papéis do IAM:
    • Para exportar traces: conceda ao principal ou à conta de serviço o papel de agente do Trace (roles/cloudtrace.agent).
    • Para exportar registros: conceda ao principal ou à conta de serviço o papel de Gravador de registros (roles/logging.logWriter).

Preços e faturamento

Ao usar a telemetria de configuração zero do Cloud de Confiance (EnableGcpTraceExporter=true ou EnableGcpLogExporter=true), os dados de telemetria são enviados para o Trace e o Logging. Esses serviços podem gerar cobranças com base no volume de dados ingeridos. Para mais informações, consulte Google Cloud Observability.

Métricas

Essa integração não é compatível com as métricas do OpenTelemetry.

Sombreamento de dependência

Para evitar conflitos de caminho de classe com o aplicativo, o driver oculta as dependências do SDK e do exportador do OpenTelemetry. A API OpenTelemetry permanece sem sombreamento para permitir a interoperabilidade com o SDK fornecido pelo aplicativo.

Correlação de registros e traces

Quando o OpenTelemetry está ativado, o driver correlaciona automaticamente os registros com os traces:

  • db.connection_id: anexado como um atributo de período a todos os períodos do JDBC.
  • jdbc.connection_id: usado como uma chave de bagagem e anexado como um rótulo a todas as entradas de registro emitidas pelo driver para o Logging.
  • ID do trace e ID do período: os registros gerados no escopo de uma execução de consulta incluem automaticamente os trace_id e span_id ativos.

Preços

É possível baixar o driver JDBC para BigQuery sem custo financeiro. No entanto, ao usar o driver, os preços padrão do BigQuery são aplicados.

A seguir