2016-01-22 26 views
5

Stiamo utilizzando l'ultima versione ufficiale ODP.NET gestita (Pubblicata: 2015-10-14 | Versione: 12.1.2400) da Oracle a un database Oracle 12 (non RAC) configurazione e non siamo in grado di mantenere attive le connessioni del database per più del normale < 3 minuti.ODP.NET Managed ConnectionPool si chiude/si apre ogni 3 minuti

nostra stringa di connessione specifica:

MAX POOL SIZE=10;MIN POOL SIZE=5;INCR POOL SIZE=1; 

e abbiamo anche provato

CONNECTION LIFETIME=90000;MAX POOL SIZE=10;MIN POOL SIZE=5;INCR POOL SIZE=1; 

Quando usiamo PerfMon sul server e guardare i contatori per HardConnects/HardDisconnects abbiamo sé che si chiude pool di connessioni e riapri 5 connessioni ogni 3 minuti e questo non è quello che ci aspettavamo.

Abbiamo questo comportamento sia in una webapp che usa EF6 per DataAccess che in un'app che non ha ORM (semplicemente vecchio SQL).

Secondo il Oracle Documentation:

Il servizio pool di connessioni chiude connessioni quando non vengono utilizzati; le connessioni sono chiuse ogni 3 minuti. L'attributo Dimensioni pool Decr della proprietà ConnectionString fornisce il servizio di pool di connessioni per il numero massimo di connessioni che possono essere chiuse ogni 3 minuti.

Per me - purché la connessione sia entro il limite di durata, ci dovrebbe essere MIN POOL SIZE di connessione valida per una durata molto più lunga di 3 minuti in ConnectionPool.

Abbiamo un'altra app che utilizza il driver Oracle di Devart e questo driver unisce le connessioni che rimangono attive per molto tempo.

Qualcun altro ha riscontrato questo "comportamento scorretto" di ConnectionPool nel driver gestito ODP.NET e ha trovato una soluzione? Oppure potrebbe trattarsi di un bug nel ConnectionPool di ODP.NET gestito?

UPDATE 2016/01/27:

ho aggiunto un'applicazione demo sul mio conto GitHub per dimostrare il problema:

https://github.com/jonnybee/OraConnTest

Questo è solo un app WinForms piccoli in cui si aggiunge la stringa di connessione e fare clic sul pulsante per avviare un worker in background che esegua "SELECT" OK "FROM DUAL" ogni 3 secondi.

La stringa di connessione contiene: POOLING = True; MAX POOL SIZE = 10; DECR POOL SIZE = 1; CONNECTION LIFETIME = 86400; INCR POOL SIZE = 1; MIN POOL SIZE = 5 + è necessario aggiungere l'ID UTENTE, PASSWORD e DATA SOURCE.

Ogni 3 minuti viene visualizzato che 5 connessioni esistenti sono chiuse e vengono create 5 nuove connessioni (impostazione MIN POOL SIZE).

Esegui lo SQL per vedere le effettive connessioni: selezionare sid, logon_time, prev_exec_start, wait_time_micro/1000 da v $ session cui programma come '% OraWinApp%' ordine da logon_time disc

Mentre il programma e perfmon è in esecuzione e vedrai questo comportamento quando le vecchie connessioni verranno chiuse e verranno create le nuove connessioni con il nuovo login_time.

+0

Nella mia comprensione, il pool di connessioni è fatto in lato client (= driver), ed è applicare questo tipo di "hard reset" sulle connessioni, quindi in teoria hai sempre il 'min pool size 'soddisfatto, solo qualche volta vengono resettati per qualche motivo. L'altro driver semplicemente non lo fa. Dato che stiamo parlando di Oracle, personalmente dubito che tu possa cambiare questo comportamento. Se questo influisce sulle prestazioni, utilizzare l'altro driver. Ma spero che qualcuno più esperto venga in questo modo :) – Koshinae

+0

Non riesco a riprodurre questo. Abilito i contatori ODP.NET e uso la stringa di connessione, apro 5 connessioni, faccio un po 'di lavoro su di esse e le chiudo e le dispongo tutte, quindi monitoro il contatore ODP.NET di HardDisconnectsPerSecond. Anche per 10 minuti non vedo Hard Disconnects. Stai facendo qualcosa di diverso da quello che ho fatto? –

+0

Vedere il mio aggiornamento in OP. Credo che tu debba svolgere un lavoro continuo mentre la pulizia del pool di connessioni si attiva quando le connessioni vengono restituite al pool. –

risposta

0

Sono d'accordo con la tua valutazione su come dovrebbe funzionare, ma il pooling di connessioni in ODP.net è un po 'strano. La chiave qui è che la durata della connessione è rispettata "quando l'applicazione chiude una connessione" dove la dimensione del pool di decr sembra avere il thread di sua proprietà. Non ho idea del motivo per cui l'hanno fatto: la convalida solo quando si restituisce il pool crea un senario in cui è possibile estrarre dal pool una connessione morta (terminata dai timeout del firewall).

In realtà ho impostato la dimensione min piscina = 0. Questo assicura che il pool sia vuoto quando l'app è inattiva. Posso quasi garantire che non noterai la differenza a meno che tu non sia su una rete molto lenta o abbia già un'istanza oracle già sovraccaricata. Il pool di connessioni è importante, ma in genere è possibile stabilire una connessione in pochi millisecondi.

L'unica cosa che mi ha gettato via qui è che tutti e 5 i collegamenti sono chiusi - Default formato piscina dim a 1.

+0

Vedere il mio aggiornamento e l'app di esempio. Ho eseguito l'app di esempio con MIN POOL SIZE = 0 e CONNNECTION LIFETIME = 86400 (= 24 ore) e anche con queste impostazioni ed eseguendo un SQL ogni 3 secondi il pool di connessioni chiuderà la connessione ogni 3 minuti. Da quello che posso vedere ODP NET non rispetta l'ambiente piscina di dimensioni e la connessione VITA Decr e consente solo il collegamento a rimanere in vita solo se sono occupate quando la pulizia è in esecuzione –