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 / user-2419

JohnMerlino's questions

Martin Hope
JohnMerlino
Asked: 2014-07-20 08:42:02 +0800 CST

a chave duplicada viola a restrição exclusiva ao usar multi-threading

  • 5

Estou usando o ExecutorService com um pool de threads fixo de 50 e um pool de conexão de banco de dados fixo de 50, usando HikariCP. Cada thread de trabalho processa um pacote (um "relatório"), verifica se ele é válido (onde cada relatório deve ter um unit_id, hora, latitude e longitude exclusivos), obtém uma conexão db do pool de conexões e, em seguida, insere o relatório no a tabela de relatórios. A restrição de exclusividade é criada com postgresql e chamada de "reports_uniqueness_index". Quando eu tenho alto volume, recebo uma tonelada do seguinte erro:

org.postgresql.util.PSQLException: ERROR: duplicate key value 
  violates unique constraint "reports_uniqueness_index"

Aqui está o que eu acredito que seja o problema. Antes da inserção do banco de dados, realizo uma verificação para determinar se já existe um relatório na tabela com o mesmo unit_id, hora, latitude e longitude. Caso contrário, o relatório é válido e eu realizo a inserção. Porém, acho que por estar usando simultaneidade tenho 50 threads cada verificando ao mesmo tempo se o relatório é válido e como nenhum deles foi inserido ainda, cada thread pensa que tem um relatório válido e quando vai inseri-los em mesmo momento, é quando o postgresql gera o erro.

Gostaria de uma solução que não gerasse latência com a simultaneidade. Tenho tentado evitar o uso de instrução sincronizada ou um bloqueio reentrante porque as inserções de banco de dados precisam ocorrer o mais rápido possível. Esta é a inserção aqui:

 private boolean save(){
        Connection conn=null;
        Statement stmt=null;
        int status=0;
        DbConnectionPool dbPool = DbConnectionPool.getInstance();
        String sql = = "INSERT INTO reports"
        sql += " (unit_id, time, time_secs, latitude, longitude, speed, created_at)";
        sql += " values (...)";
        try {
            conn = dbPool.getConnection();
            stmt = conn.createStatement();
            status = stmt.executeUpdate(sql);
        } catch (SQLException e) {
            return false;
        } finally {
            try {
                if (stmt != null)  
                {  
                    stmt.close();
                }  

                if (conn != null)  
                {  
                    conn.close();  
                }  
            } catch(SQLException e){}
        }

        if(status > 0){
            return true;            
        }

        return false;
}

Uma solução que pensei foi usar o próprio objeto Class como um objeto de bloqueio:

synchronized(Report.class) {
    status = stmt.executeUpdate(sql);
}

Mas isso atrasará a inserção de outros segmentos. Existe uma solução melhor?

postgresql java
  • 1 respostas
  • 18649 Views
Martin Hope
JohnMerlino
Asked: 2014-07-03 17:33:59 +0800 CST

A remoção de uma restrição de chave estrangeira afetará o desempenho?

  • 1

Eu tenho uma tabela de unidades e uma tabela de relatórios. Uma unidade tem muitos relatórios. Portanto, a tabela de relatórios possui uma chave estrangeira unit_id que corresponde ao id da unidade. Portanto, há uma restrição de chave estrangeira na tabela de relatórios.

Comecei a perceber que às vezes os relatórios precisam ser criados mesmo que a unidade ainda não exista para eles. Então, quando tentei criar um relatório sem uma unidade, obviamente recebi este erro:

 ERROR: insert or update on table "reports" violates foreign key constraint "reports_unit_id_fkey"
  Detail: Key (unit_id)=(7295) is not present in table "units".

Minha pergunta é se eu remover essa restrição de chave estrangeira e permitir que os relatórios sejam criados sem uma unidade, isso afetará o desempenho quando eu tentar obter todos os relatórios associados a uma unidade?

SELECT * FROM reports WHERE unit_id=7295;

A única outra opção que tenho é inserir os relatórios em alguma tabela de órfãos, mas teria que copiar esses órfãos quando a unidade for criada, o que é um trabalho adicional.

postgresql
  • 1 respostas
  • 1701 Views
Martin Hope
JohnMerlino
Asked: 2014-06-28 18:49:32 +0800 CST

Obter registro de data e hora de criação de banco de dados do PostgreSQL?

  • 1

Existe uma maneira de obter uma data e hora de quando um determinado banco de dados foi criado no Postgresql?

O \listcomando não fornece um carimbo de data/hora.

postgresql
  • 1 respostas
  • 3706 Views
Martin Hope
JohnMerlino
Asked: 2014-04-21 15:57:57 +0800 CST

Diferença entre now() e current_timestamp

  • 90

No PostgreSQL, uso a função now()and current_timestampe não vejo diferença:

# SELECT now(), current_timestamp;
              now               |              now               
--------------------------------+--------------------------------
 04/20/2014 19:44:27.215557 EDT | 04/20/2014 19:44:27.215557 EDT
(1 row)

Estou esquecendo de algo?

postgresql timestamp
  • 2 respostas
  • 84339 Views
Martin Hope
JohnMerlino
Asked: 2014-03-22 04:34:22 +0800 CST

Aliases com subconsultas correlacionadas

  • 3

Estou vendo um exemplo de subconsulta correlacionada com aliases de um livro do PostgreSQL:

bpsimple=# SELECT * FROM orderinfo o,
bpsimple=# (SELECT * FROM customer c WHERE town = 'Bingham') c
bpsimple=# WHERE c.customer_id = o.customer_id;

Por que o calias é usado duas vezes aqui? O que está entre parênteses não é suficiente?

postgresql subquery
  • 1 respostas
  • 2497 Views
Martin Hope
JohnMerlino
Asked: 2014-03-16 07:55:38 +0800 CST

reiniciando o postgresql rapidamente

  • 5

Estou lendo o livro de receitas do postgresql admin. Alguns dos parâmetros do servidor de banco de dados exigem uma reinicialização e, com um banco de dados ocupado, pode ser necessário reiniciar rapidamente. Há várias coisas a fazer para acelerar a reinicialização: 1) emitir um ponto de verificação normal antes do ponto de verificação de desligamento, 2) liberar todos os shared_buffers sujos no disco, 3) registrar o conteúdo do cache do banco de dados antes do desligamento e, em seguida, aquecer o cache novamente imediatamente após reiniciar. Portanto, o livro parece recomendar:

psql -c "CHECKPOINT"
psql -c "select pg_cache_save('mycache')"
pg_ctl -D datadir -m immediate restart
psql -c "select pg_cache_warm('mycache')"

Ele também mostrou esse método para:

pg_ctl -D datadir restart -m fast

Qual devo usar ao reiniciar um banco de dados ocupado que recebe inserções com muita frequência? Uma das opções acima ou existe um método melhor?

postgresql postgresql-9.1
  • 1 respostas
  • 1424 Views
Martin Hope
JohnMerlino
Asked: 2014-03-09 15:49:42 +0800 CST

otimização de subconsultas caras

  • 1

A consulta a seguir obtém o último relatório (onde latitude, longitude e segundos são <> 0) associado às unidades especificadas:

SELECT 
    reports.* 
FROM
    reports 
    INNER JOIN 
        units 
        ON units.id = reports.unit_id 
WHERE 
    reports.unit_id IN (1111, 1112, 1113) 
    AND 
    (
        reports.id = 
        (
            SELECT reports.id 
            FROM reports
            WHERE reports.unit_id = units.id
            AND
            reports.time_secs != 0
            AND 
            reports.latitude != 0.0
            AND
            reports.longitude != 0.0
            ORDER BY time desc
            LIMIT 1
        )
    )

Essa consulta levou vários minutos para ser executada e gostaria de saber se há uma otimização que eu possa fazer nela.

postgresql performance
  • 2 respostas
  • 597 Views
Martin Hope
JohnMerlino
Asked: 2014-03-06 10:37:53 +0800 CST

Removendo registros do banco de dados periodicamente que ultrapassam a linha do tempo

  • 1

Eu tenho uma tabela de relatórios que tem literalmente milhões, senão centenas de milhões de registros de relatórios, que datam de 2011. Acho que está diminuindo exponencialmente minhas consultas. Eu só quero manter os relatórios dos últimos 6 meses. Eu tenho uma coluna de tempo na tabela de relatórios que fornece a hora atual para que eu possa usá-la para medir relatórios com mais de 6 meses. Então, estou pensando em executar algum tipo de trabalho cron no meu servidor ubuntu no qual o servidor postgresql está instalado. Mas estou procurando alguma orientação sobre como fazer isso.

postgresql
  • 1 respostas
  • 2242 Views

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