O conector JDBC lê e grava em bancos de dados relacionais — MySQL, PostgreSQL e Oracle — usando DDL SQL padrão em jobs do Flink SQL.
Tipos de tabela suportados: tabela de origem · tabela de dimensão · tabela de destino
Modos de execução suportados: modo streaming · modo batch · API SQL
Atualizações e exclusões em tabelas de destino: suportadas
Pré-requisitos
Antes de começar, certifique-se de que:
O banco de dados e a tabela de destino já existem
O JAR do driver JDBC do banco de dados está disponível para upload
Limitações
Leituras limitadas: uma tabela de origem JDBC é uma fonte limitada. A tarefa é concluída após a leitura de todas as linhas. Para capturar dados de alteração em tempo real, use um conector CDC (Change Data Capture) — consulte Criar uma tabela de origem MySQL CDC e Criar uma tabela de origem PostgreSQL CDC (preview público).
Versão do PostgreSQL: a gravação no PostgreSQL requer a versão 9.5 ou posterior, pois a tabela de destino depende da cláusula
ON CONFLICT.-
Upload do driver JDBC: faça o upload do JAR do driver JDBC como arquivo de dependência antes de executar o job. Drivers comuns:
Banco de dados
Group ID
Artifact ID
MySQL
mysqlOracle
com.oracle.database.jdbcPostgreSQL
org.postgresqlPara drivers não listados aqui, verifique a compatibilidade antes de usar.
-
Comportamento de upsert do MySQL: ao gravar em uma tabela de destino MySQL com chave primária, o conector emite instruções
INSERT INTO ... ON DUPLICATE KEY UPDATE ....AvisoA inserção de linhas com valores de índice exclusivo duplicados — mesmo quando as chaves primárias são diferentes — sobrescreve as linhas existentes em qualquer tabela física com restrição de índice exclusivo, causando perda de dados.
Criar uma tabela JDBC
CREATE TABLE jdbc_table (
`id` BIGINT,
`name` VARCHAR,
PRIMARY KEY (id) NOT ENFORCED
) WITH (
'connector' = 'jdbc',
'url' = 'jdbc:<db-type>://<host>:<port>/<database>',
'table-name' = '<yourTable>',
'username' = '<yourUsername>',
'password' = '<yourPassword>'
);
Opções do conector
Geral
|
Opção |
Tipo |
Obrigatória |
Padrão |
Descrição |
|
|
STRING |
Sim |
— |
Defina como |
|
|
STRING |
Sim |
— |
URL JDBC do banco de dados. |
|
|
STRING |
Sim |
— |
Nome da tabela de leitura ou gravação. |
|
|
STRING |
Não |
— |
Nome de usuário do banco de dados. Configure junto com |
|
|
STRING |
Não |
— |
Senha do banco de dados. |
|
|
STRING |
Não |
— |
O endpoint do gateway compartilhado ou gateway dedicado do KMS, por exemplo, |
|
|
STRING |
Não |
— |
O nome da função RAM usada para ler credenciais KMS. A função deve ser referenciada previamente em Segurança. Obrigatório ao usar credenciais KMS. Para mais detalhes, consulte Integração com gerenciamento de credenciais KMS. |
|
|
STRING |
Não |
— |
O caminho do certificado CA do gateway dedicado do KMS. Defina esta opção como um caminho absoluto do OSS no formato |
Opções de origem
|
Opção |
Tipo |
Obrigatória |
Padrão |
Descrição |
|
|
STRING |
Não |
— |
Coluna usada para dividir os dados em partições. A coluna deve ser NUMERIC ou TIMESTAMP, e o banco de dados deve suportar comparação desse tipo com valores numéricos. Consulte Leitura particionada. |
|
|
INTEGER |
Não |
— |
Número de partições. |
|
|
LONG |
Não |
— |
Menor valor da primeira partição. |
|
|
LONG |
Não |
— |
Maior valor da última partição. |
|
|
INTEGER |
Não |
|
Linhas buscadas por ida e volta ao banco de dados. Se definida como |
|
|
BOOLEAN |
Não |
|
Ativa o auto-commit para transações de leitura. |
Opções de destino
|
Opção |
Tipo |
Obrigatória |
Padrão |
Descrição |
|
|
INTEGER |
Não |
|
Máximo de linhas no buffer antes do flush. Defina como |
|
|
DURATION |
Não |
|
Tempo máximo de retenção das linhas no buffer antes do flush. Defina como |
|
|
INTEGER |
Não |
|
Máximo de tentativas de gravação em caso de falha. |
|
|
BOOLEAN |
Não |
|
Ignora mensagens de exclusão em vez de encaminhá-las. Requer VVR 11.4+. |
|
|
STRING |
Não |
|
Controla quais mensagens de exclusão são ignoradas quando |
Para liberar as linhas do buffer de forma assíncrona por temporizador em vez de por contagem de linhas, defina sink.buffer-flush.max-rows como 0 e configure sink.buffer-flush.interval com o intervalo de flush desejado.
Opções de tabela de dimensão
|
Opção |
Tipo |
Obrigatória |
Padrão |
Descrição |
|
|
INTEGER |
Não |
— |
Máximo de linhas no cache de consulta. Quando o cache está cheio, a linha menos recentemente usada expira. O cache fica desativado a menos que |
|
|
DURATION |
Não |
— |
Tempo máximo de validade de uma linha em cache antes de expirar. |
|
|
BOOLEAN |
Não |
|
Armazena em cache os resultados de consulta vazios para evitar consultas repetidas ao banco de dados para chaves inexistentes. Defina como |
|
|
INTEGER |
Não |
|
Máximo de tentativas quando uma consulta ao banco de dados falha. |
Opções do PostgreSQL
|
Opção |
Tipo |
Obrigatória |
Padrão |
Descrição |
|
|
BOOLEAN |
Não |
|
Quando |
Comportamentos principais
Leitura particionada
Para ativar leituras paralelas de uma tabela de origem, configure as opções scan.partition.column, scan.partition.lower-bound e scan.partition.upper-bound junto com scan.partition.num. A coluna de partição deve ser numérica ou TIMESTAMP. Para detalhes sobre como as divisões são calculadas, consulte Leitura particionada na documentação do Apache Flink.
Cache de consulta
Por padrão, cada consulta de lookup join acessa o banco de dados diretamente. Ative o cache LRU definindo lookup.cache.max-rows e lookup.cache.ttl para reduzir a carga no banco de dados ao custo de dados levemente desatualizados.
Gravações idempotentes
Quando a tabela de destino tem uma chave primária, o conector emite instruções de upsert específicas do banco de dados. Para MySQL, o conector usa INSERT ... ON DUPLICATE KEY UPDATE ....
Exemplos
Todos os três exemplos usam um conector blackhole ou datagen como contraparte leve para que as instruções sejam autônomas.
Ler de um banco de dados (tabela de origem)
CREATE TEMPORARY TABLE jdbc_source (
`id` INT,
`name` VARCHAR
) WITH (
'connector' = 'jdbc',
'url' = 'jdbc:mysql://localhost:3306/mydb',
'table-name' = '<yourTable>',
'username' = '<yourUsername>',
'password' = '<yourPassword>'
);
CREATE TEMPORARY TABLE blackhole_sink (
`id` INT,
`name` VARCHAR
) WITH (
'connector' = 'blackhole'
);
INSERT INTO blackhole_sink SELECT * FROM jdbc_source;
Gravar em um banco de dados (tabela de destino)
CREATE TEMPORARY TABLE datagen_source (
`name` VARCHAR,
`age` INT
) WITH (
'connector' = 'datagen'
);
CREATE TEMPORARY TABLE jdbc_sink (
`name` VARCHAR,
`age` INT
) WITH (
'connector' = 'jdbc',
'url' = 'jdbc:mysql://localhost:3306/mydb',
'table-name' = '<yourTable>',
'username' = '<yourUsername>',
'password' = '<yourPassword>'
);
INSERT INTO jdbc_sink SELECT * FROM datagen_source;
Enriquecer um stream com consultas ao banco de dados (tabela de dimensão)
CREATE TEMPORARY TABLE datagen_source (
`id` INT,
`data` BIGINT,
`proctime` AS PROCTIME()
) WITH (
'connector' = 'datagen'
);
CREATE TEMPORARY TABLE jdbc_dim (
`id` INT,
`name` VARCHAR
) WITH (
'connector' = 'jdbc',
'url' = 'jdbc:mysql://localhost:3306/mydb',
'table-name' = '<yourTable>',
'username' = '<yourUsername>',
'password' = '<yourPassword>'
);
CREATE TEMPORARY TABLE blackhole_sink (
`id` INT,
`data` BIGINT,
`name` VARCHAR
) WITH (
'connector' = 'blackhole'
);
-- Look up the matching name for each stream record at processing time
INSERT INTO blackhole_sink
SELECT T.`id`, T.`data`, H.`name`
FROM datagen_source AS T
JOIN jdbc_dim FOR SYSTEM_TIME AS OF T.proctime AS H
ON T.id = H.id;
Mapeamento de tipos de dados
|
MySQL |
Oracle |
PostgreSQL |
Flink SQL |
|
|
— |
— |
|
|
|
— |
|
|
|
|
— |
|
|
|
|
— |
|
|
|
|
— |
— |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
— |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
— |
— |
|
|
Próximos passos
Criar uma tabela de origem MySQL CDC — capture dados de alteração em tempo real do MySQL
Criar uma tabela de origem PostgreSQL CDC (preview público) — capture dados de alteração em tempo real do PostgreSQL