2014-07-10 12 views
6

Ogni volta che avviare il motore database PostgreSQL, ho quasi 7-8 query in esecuzione in background SET extra_float_digits = 3extra_float_digits SET = 3 in PostgreSQL

io non sono sicuro perché questi sono in esecuzione tutte le volte. So che la variabile extra_float_digits regola il numero di cifre visualizzate per i valori in virgola mobile in Postgresql, tuttavia non sono sicuro del motivo per cui queste query vengono eseguite in background quando avvio il motore DB.

Ho già extra_float_digits = 3 nel file di configurazione. Anche se io commento fuori, queste query ancora eseguiti in background ..

bisogno help..Thanks

+2

Se una connessione è inattiva, le statistiche di sessione di Postgres riporteranno ancora l'ultima istruzione eseguita. Sei sicuro che queste query siano effettivamente in esecuzione? –

+0

Controllato di nuovo e vedo queste e altre query come inattive .. Qual è lo scopo di questa query? e c'è un query_timeout che possiamo avere in modo che questi vengano scaduti? – WinSupp

+2

Quella query non viene emessa da Postgres, è l'applicazione che si connette a Postgres che esegue tali istruzioni. –

risposta

8

Le query non sono realmente in esecuzione. Come dice Nick nei commenti, le connessioni saranno in stato di inattività. pg_stat_activity mostra l'ultima istruzione terminata in esecuzione quando una query è inattiva.

Per quanto riguarda l'altra parte: direi che stai usando PgJDBC. SET extra_float_digits assicura che PgJDBC non perda precisione quando ottiene valori in virgola mobile dal database. Fa parte della conversazione iniziale di connessione. È normale e puoi ignorarlo. If you're on a recent PgJDBC, send the additional connection parameter assumeMinServerVersion=9.0 and it'll go away.

Quindi quello che hai c'è un sacco di nuove connessioni inattive.

Controllare la configurazione dell'applicazione/del server applicazioni. Probabilmente il tuo pool di connessioni non ha limiti ragionevoli.

+0

@WinSupp Qualcosa da dire qui? Sei diventato silenzioso. La mia risposta è stata utile? –

+0

Questa proprietà non sembra essere documentata (http://jdbc.postgresql.org/documentation/head/index.html) e inoltre non ho trovato questo nel sorgente per il driver 9.3. Significa "recente PgJDBC", questo è disponibile solo nel prossimo driver 9.4? –

0

Ogni volta che viene stabilita una nuova connessione, postgres attiva questa impostazione extra_float_digits. Il problema riguardava il modulo di controllo dello stato del mio database.

1

Ho riscontrato questo problema con Java e Postgresql. Ho risolto questo problema utilizzando PGPoolingDataSource e Chiudi connessione.

Ecco come ho costruito le mie lezioni:

// class factory di connessione:

public class FacConn { 

    public static PGPoolingDataSource getConnection2() { 
    PGPoolingDataSource source = new PGPoolingDataSource(); 
    source.setServerName("local"); 
    source.setPortNumber(5432); 
    source.setDatabaseName("mydbname"); 
    source.setUser("LoginUser"); 
    source.setPassword("password"); 
    source.setAssumeMinServerVersion("9.0"); 
    source.setConnectTimeout(50000);   

    return source;  
    } 
} 

// Classe userDAO - classe di interagire con il database

public class UsuarioDAO { 

    private PGPoolingDataSource poolDS = FabConexao.getConnection2(); 
    private Connection con = null; 

    public User searchById(Integer id){ 
     try{con = poolDS.getConnection();} 
     catch (SQLException e){throw new RuntimeException(e);} 

     String sql = "Select * from people where id_people=?"; 
     ResultSet rs = null; 

     try (PreparedStatement smtm = con.prepareStatement(sql)){ 
      smtm.setInt(1, id); 
      rs = smtm.executeQuery(); 
      People people = new People(); 
      if(rs.next()){ 
       people.setId_People(rs.getInt("id_people")); 
       people.setFirtname(rs.getString("firstname")); 
       people.setLastname(rs.getString("lastname")); 
       people.setAge(rs.getInt("age")); 
       people.setActiv(rs.getBoolean("activ")); 
      } 
      smtm.close(); 
      return people; 
     } catch (SQLException e){ 
      e.printStackTrace(); 
      System.err.println(e.getClass().getName()+": "+ e.getMessage());   
     } finally { 
      if (rs != null) { 
       try {rs.close();} catch (SQLException e) { /* ignored */} 
      } 
      poolDS.close(); 
     } 
     return null; 
} 
0

nella mia scelta puoi terminare queste connessioni con un comando pg. Ad esempio:

SELEZIONA pg_terminate_backend (t.pid) FROM (SELECT pid FROM pg_stat_activity WHERE state = 'inattività' E interrogazione come '% flottante%' E STATE_CHANGE < (ora() - intervallo di '1 ora')) AS t;