AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / dba / Perguntas / 333718
Accepted
DSZ
DSZ
Asked: 2023-12-04 20:28:08 +0800 CST2023-12-04 20:28:08 +0800 CST 2023-12-04 20:28:08 +0800 CST

Tabelas temporárias e pools de conexões do MySQL

  • 772

Esta é mais uma pergunta do tipo "por favor, confirme/corrija meu entendimento".

Histórico Eu me conecto ao MySQL usando JDBC, o pool de conexões tem cerca de 250 conexões, a maioria das quais parece conectada persistentemente mesmo após o encerramento da consulta - todas usam a mesma conta de usuário. O procedimento armazenado para o qual desejo usar uma tabela temporária é chamado pelo código Java e executa uma transformação em uma coluna JSON para convertê-la em uma linha para uma tabela diferente. A transformação é relativamente cara, executada potencialmente em milhares de linhas, por isso não desejo realizar a transformação mais de uma vez. Para contornar isso, minha solução proposta é transformar os dados em uma tabela temporária, realizar minhas consultas estatísticas em torno dos dados agora transformados e, em seguida, inserir esse atacado na tabela de destino.

Pergunta Eu li que as tabelas temporárias estão vinculadas ao User . Estou certo ao teorizar que, como as conexões aparentemente nunca são encerradas e todas usam a mesma conta de usuário, a tabela temporária criada no procedimento seria compartilhada por todas as conexões e consultas (e assim os dados poderiam ser acessados ​​por outras conexões executando o mesmo procedimento ao mesmo tempo)?

Limitações O que eu gostaria de fazer é transmitir os dados originais ou realizar a transformação e transmitir esses dados de volta para Java. No entanto, estamos lidando com cerca de algumas centenas de megabytes de dados de cada vez e a transferência de dados de volta para Java parece bloquear o banco de dados até que a transmissão seja concluída. (Não sei por que, se alguém tiver uma recomendação para corrigir isso, por favor me avise)

Então, fico com a única outra solução que consegui pensar: não transmitir os dados de origem, mas realizar a transformação, coletar os dados agregados necessários e, em seguida, inserir os dados transformados no destino sem que eles saiam do banco de dados servidor.

desde já, obrigado

mysql
  • 3 3 respostas
  • 37 Views

3 respostas

  • Voted
  1. Best Answer
    mustaccio
    2023-12-04T20:50:03+08:002023-12-04T20:50:03+08:00

    cerca de 250 conexões, a maioria das quais parecem persistentemente conectadas

    Esse é o propósito de um pool de conexões: manter as conexões abertas e permitir que os aplicativos as reutilizem, em vez de passar pelo caro processo de estabelecer novas conexões.

    De acordo com a documentação , "[uma] TEMPORARYtabela é visível apenas na sessão atual". Isso significa que não, uma tabela temporária criada por uma conexão não será compartilhada por todas as conexões. No entanto, quando outro aplicativo obtiver uma conexão do pool, ele verá todas as tabelas temporárias criadas até o momento na sessão correspondente a essa conexão.

    • 2
  2. Bill Karwin
    2023-12-05T00:20:18+08:002023-12-05T00:20:18+08:00

    As tabelas temporárias estão vinculadas a uma sessão específica, não a um usuário. No MySQL, você pode ter muitas sessões ativas simultaneamente com o mesmo usuário. Cada uma delas pode ter uma tabela temporária com o mesmo nome, mas nenhuma pode ver nenhuma das outras fora de sua própria sessão. Desta forma, é como uma variável local em uma função.

    As conexões são mantidas abertas pelo pool de conexões, mas os clientes subsequentes que adquirem uma determinada conexão não veem as tabelas temporárias deixadas por um cliente anterior.

    Quando um cliente solicita uma nova conexão de um pool de conexões, por padrão a implementação do pool redefine o estado da conexão. Isso significa que a sessão do MySQL limpa todos os dados relacionados à sessão, como transações, variáveis ​​de sessão, tabelas temporárias e instruções preparadas.

    https://github.com/mysql/mysql-connector-j/blob/release/8.x/src/main/user-impl/java/com/mysql/cj/jdbc/MysqlPooledConnection.java#L125-L127

    protected synchronized Connection getConnection(boolean resetServerState, boolean forXa) throws SQLException {
    ...
            if (resetServerState) {
                this.physicalConn.resetServerState();
            }
    

    Faz sentido que isso seja uma boa opção, pois caso contrário, um cliente que solicitasse uma conexão de um pool de conexões poderia visualizar os dados deixados por um cliente anterior dessa conexão. Isso criaria o risco de vazamento de dados privados de um cliente para outro.

    Todas as implementações de pool de conexões que conheço usam esse recurso de redefinição de conexão há anos. Acredito que alguns conectores não conseguiram fazer isso anos atrás, mas foram corrigidos. Se você ainda estiver usando um pool de conexões que não redefine a conexão, pare de usá-lo e mude para uma implementação mais moderna.

    • 1
  3. Rick James
    2023-12-05T01:49:59+08:002023-12-05T01:49:59+08:00

    CREATE TEMPORARY TABLEnão é seguro para sua tarefa.

    Posso sugerir a criação de uma tabela 'permanente' para armazenar os dados processados. Em seguida, crie algum mecanismo, possivelmente por meio de outra tabela permanente, para dizer qual tabela possui quais dados foram processados.

    Algum tipo de soma de verificação ou hash pode ser usado para identificar exclusivamente o conjunto de dados. Esse poderia ser o PRIMARY KEYnúmero de dados que contêm os dados processados.

    • 0

relate perguntas

  • Existem ferramentas de benchmarking do MySQL? [fechado]

  • Onde posso encontrar o log lento do mysql?

  • Como posso otimizar um mysqldump de um banco de dados grande?

  • Quando é o momento certo para usar o MariaDB em vez do MySQL e por quê?

  • Como um grupo pode rastrear alterações no esquema do banco de dados?

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    conectar ao servidor PostgreSQL: FATAL: nenhuma entrada pg_hba.conf para o host

    • 12 respostas
  • Marko Smith

    Como fazer a saída do sqlplus aparecer em uma linha?

    • 3 respostas
  • Marko Smith

    Selecione qual tem data máxima ou data mais recente

    • 3 respostas
  • Marko Smith

    Como faço para listar todos os esquemas no PostgreSQL?

    • 4 respostas
  • Marko Smith

    Listar todas as colunas de uma tabela especificada

    • 5 respostas
  • Marko Smith

    Como usar o sqlplus para se conectar a um banco de dados Oracle localizado em outro host sem modificar meu próprio tnsnames.ora

    • 4 respostas
  • Marko Smith

    Como você mysqldump tabela (s) específica (s)?

    • 4 respostas
  • Marko Smith

    Listar os privilégios do banco de dados usando o psql

    • 10 respostas
  • Marko Smith

    Como inserir valores em uma tabela de uma consulta de seleção no PostgreSQL?

    • 4 respostas
  • Marko Smith

    Como faço para listar todos os bancos de dados e tabelas usando o psql?

    • 7 respostas
  • Martin Hope
    Jin conectar ao servidor PostgreSQL: FATAL: nenhuma entrada pg_hba.conf para o host 2014-12-02 02:54:58 +0800 CST
  • Martin Hope
    Stéphane Como faço para listar todos os esquemas no PostgreSQL? 2013-04-16 11:19:16 +0800 CST
  • Martin Hope
    Mike Walsh Por que o log de transações continua crescendo ou fica sem espaço? 2012-12-05 18:11:22 +0800 CST
  • Martin Hope
    Stephane Rolland Listar todas as colunas de uma tabela especificada 2012-08-14 04:44:44 +0800 CST
  • Martin Hope
    haxney O MySQL pode realizar consultas razoavelmente em bilhões de linhas? 2012-07-03 11:36:13 +0800 CST
  • Martin Hope
    qazwsx Como posso monitorar o andamento de uma importação de um arquivo .sql grande? 2012-05-03 08:54:41 +0800 CST
  • Martin Hope
    markdorison Como você mysqldump tabela (s) específica (s)? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    Jonas Como posso cronometrar consultas SQL usando psql? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas Como inserir valores em uma tabela de uma consulta de seleção no PostgreSQL? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas Como faço para listar todos os bancos de dados e tabelas usando o psql? 2011-02-18 00:45:49 +0800 CST

Hot tag

sql-server mysql postgresql sql-server-2014 sql-server-2016 oracle sql-server-2008 database-design query-performance sql-server-2017

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve