Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Wind Tre 'accende' il 5G Standalone in Italia: si apre una nuova era basata sui servizi
Wind Tre 'accende' il 5G Standalone in Italia: si apre una nuova era basata sui servizi
Con la prima rete 5G Standalone attiva in Italia, WINDTRE compie un passo decisivo verso un modello di connettività intelligente che abilita scenari avanzati per imprese e pubbliche amministrazioni, trasformando la rete da infrastruttura a piattaforma per servizi a valore aggiunto
OPPO Find X9 Pro: il camera phone con teleobiettivo da 200MP e batteria da 7500 mAh
OPPO Find X9 Pro: il camera phone con teleobiettivo da 200MP e batteria da 7500 mAh
OPPO Find X9 Pro punta a diventare uno dei riferimenti assoluti nel segmento dei camera phone di fascia alta. Con un teleobiettivo Hasselblad da 200 MP, una batteria al silicio-carbonio da 7500 mAh e un display da 6,78 pollici con cornici ultra ridotte, il nuovo flagship non teme confronti con la concorrenza, e non solo nel comparto fotografico mobile. La dotazione tecnica include il processore MediaTek Dimensity 9500, certificazione IP69 e un sistema di ricarica rapida a 80W
DJI Romo, il robot aspirapolvere tutto trasparente
DJI Romo, il robot aspirapolvere tutto trasparente
Anche DJI entra nel panorama delle aziende che propongono una soluzione per la pulizia di casa, facendo leva sulla propria esperienza legata alla mappatura degli ambienti e all'evitamento di ostacoli maturata nel mondo dei droni. Romo è un robot preciso ed efficace, dal design decisamente originale e unico ma che richiede per questo un costo d'acquisto molto elevato
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 03-06-2014, 16:20   #1
chicco19811
Member
 
Iscritto dal: Oct 2009
Messaggi: 72
[JAVA] java.sql.SQLRecoverableException: Closed Connection

ho una web application che gira su weblogic e si collega a oracle; non l' ho fatta io (almeno nessuno mi sgrida :-)) ma ho guardato la parte di connessione e fa qualcosa del genere

Codice:
public class DBUtility {
	private static Connection connection = null;

	public static Connection getConnection() {
		if (connection != null)
			return connection;
		
		else {
			 
			try {
				 
				String driver ="oracle.jdbc.driver.OracleDriver"; 
                String url ="jdbc:oracle:thin:@DBSCA04:1889:SCA04"; 
                String user ="user"; 
                String password  ="password"; 
                 
				Class.forName(driver);

				connection = DriverManager.getConnection(url, user, password);
			} catch (ClassNotFoundException e) {
				e.printStackTrace();
			} catch (SQLException e) {
				e.printStackTrace();

			} catch (FileNotFoundException e) {
				e.printStackTrace();
			} catch (IOException e) {
				e.printStackTrace();
			}
			return connection;
			//	}
		}
	}
}



public class DBCrudCountry
{
    private Connection connection;
    
  ....
    
    public DBCrudCountry()
    {
    	 connection = DBUtility.getConnection();
    }
    
	 public void updateItem(Country item, int delete)
    {
        delete(item);
        insert(item, delete);
    }
    
	 private void insert(Country item, int delete)
    {
      ...
    }
    
	
    private void delete(Country item)
    {
        PreparedStatement preparedStatement;
        try
        {
            preparedStatement = connection.prepareStatement("update " + tableName + " set DELETED=?" + " where ID=?");
            preparedStatement.setInt(1, 1);
            preparedStatement.setInt(2, item.getId());
            preparedStatement.executeUpdate();
        }
        catch (SQLException e)
        {
            e.printStackTrace();
        }
    }

}




public class DBControllerCountry extends HttpServlet
{
   
    private DBCrudCountry crud;
    
    
    public DBControllerCountry()
    {
        crud = new DBCrudCountry();
    }
    
    
    
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
    {
        if (request.getParameter("action") != null)
        {
           
            if (action.equals("list"))
            {
               ...
            }
            else if  ( action.equals("delete"))
            {
               ...
                try
                {
                    if (action.equals("create"))
                    {
                       ..
                    }
                    else if (action.equals("update"))
                    {
                       ...
                    }
                    else if (action.equals("delete"))
                    {
                        if (request.getParameter("id") != null)
                        {
                            item = crud.getItem(Integer.parseInt(request.getParameter("id")));
                            crud.updateItem(item, 1);
                             
                        }
                    }
                }
                catch (Exception ex)
                {
                    String error = "{\"Result\":\"ERROR\",\"Message\":" + ex.getStackTrace().toString() + "}";
                    response.getWriter().print(error);
                }
            }
        }
    }
    
    
}

funziona perfettamente ma ogni giorno devo riavviare nel senso che se oggi tutto funziona, domani mattina arrivo qua e la connessione fallisce; nei log mi da questi errori

java.sql.SQLRecoverableException: IO Error: Broken pipe
...
Caused by: java.net.SocketException: Broken pipe
...
java.sql.SQLRecoverableException: Closed Connection


dal supporto capisco che

i database vengono backuppati a freddo tutte le notti. Pertanto le connessioni lasciate attive senza un sistema di auto-reconnect non risultano più attive.

posso rimediare al codice che ho postato senza stravolgere tutto?
a me non pare correttissimo ma ho bisogno di fare nella maniera più veloce possibile, almeno per ora

grazie
chicco19811 è offline   Rispondi citando il messaggio o parte di esso
Old 05-06-2014, 16:31   #2
Daniels118
Senior Member
 
L'Avatar di Daniels118
 
Iscritto dal: Jan 2014
Messaggi: 852
La persona che ha scritto quel codice evidentemente non ha cognizione del fatto che un application server può servire più richieste contemporaneamente, ergo dovrebbe istanziare una nuova connessione al db per ogni richiesta.

Prova a fare queste modifiche:
1) rimuovi la variabile statica "connection" dalla classe DBUtility e fai creare al metodo getConnection una nuova connessione ogni volta che viene richiamato;
2) modifica tutte le classi che estendono HttpServlet, rimuovi la proprietà crud, ed elimina la sua creazione dal costruttore, quindi inserisci dichiarazione ed inizializzazione di crud direttamente nei metodi doPost/doGet.
Non è il massimo in termini di performance, ma di sicuro ne guadagnerai in coerenza delle operazioni.
Daniels118 è offline   Rispondi citando il messaggio o parte di esso
Old 06-06-2014, 14:22   #3
sottovento
Senior Member
 
L'Avatar di sottovento
 
Iscritto dal: Nov 2005
Città: Texas
Messaggi: 1722
Io modificherei in

Codice:
public static Connection getConnection() {
		if (connection != null && connection.isValid(1000))
			return connection;
dovrebbe essere sufficiente. Se per caso ti vene la paura che le prestazioni possano risentirne, quando catturi l'eccezione che hai descritto, chiudi la connessione (e' inutile ma sicuro) - facendo attenzione a non lasciar trapelare alcuna eccezione - e poi, metti connection a null. Al ciclo successivo ritentera' la connessione.

ATTENZIONE - questo significa che registrera' nuovamente il driver. Potresti evitare di farlo ad ogni riconnessione e farlo solo all'inizio dell'applicazione.
__________________
In God we trust; all others bring data
sottovento è offline   Rispondi citando il messaggio o parte di esso
Old 06-06-2014, 22:14   #4
Daniels118
Senior Member
 
L'Avatar di Daniels118
 
Iscritto dal: Jan 2014
Messaggi: 852
Quote:
Originariamente inviato da sottovento Guarda i messaggi
Io modificherei in

Codice:
public static Connection getConnection() {
		if (connection != null && connection.isValid(1000))
			return connection;
dovrebbe essere sufficiente. Se per caso ti vene la paura che le prestazioni possano risentirne, quando catturi l'eccezione che hai descritto, chiudi la connessione (e' inutile ma sicuro) - facendo attenzione a non lasciar trapelare alcuna eccezione - e poi, metti connection a null. Al ciclo successivo ritentera' la connessione.

ATTENZIONE - questo significa che registrera' nuovamente il driver. Potresti evitare di farlo ad ogni riconnessione e farlo solo all'inizio dell'applicazione.
Non credo sia sufficiente perché DBCrudCountry chiama getConnection solo nel costruttore, per cui impostando connection a null, essa rimane null. Bisognerebbe invece scrivere "connection = DBUtility.getConnection()" all'interno di ogni catch di quel tipo.
Daniels118 è offline   Rispondi citando il messaggio o parte di esso
Old 07-06-2014, 06:04   #5
sottovento
Senior Member
 
L'Avatar di sottovento
 
Iscritto dal: Nov 2005
Città: Texas
Messaggi: 1722
Quote:
Originariamente inviato da Daniels118 Guarda i messaggi
Non credo sia sufficiente perché DBCrudCountry chiama getConnection solo nel costruttore, per cui impostando connection a null, essa rimane null. Bisognerebbe invece scrivere "connection = DBUtility.getConnection()" all'interno di ogni catch di quel tipo.
Beh si, hai ragione. Non avevo letto tutto il codice, dando per scontato che fosse gia' cosi'. Chiedo perdono!!!
__________________
In God we trust; all others bring data
sottovento è offline   Rispondi citando il messaggio o parte di esso
Old 08-06-2014, 19:01   #6
Maui78
Senior Member
 
L'Avatar di Maui78
 
Iscritto dal: Jan 2005
Messaggi: 395
Ciao, non conosco weblogic, ma lavoro da anni su altri application server. Verifica se sul datasource, lato weblogic, esista qualcosa che "pre-testa" la connessione. Se è ok, bene, la uso, altrimenti ne apro un'altra.
Il pretest normalmente è un qualcosa che gira a cadenza di 120 secondi o giù di lì, si esegue una query sul db, stupida, tipo un select sysdate from dual, tanto per vedere se la connessione è viva.
Per quanto l'approccio via codice potrebbe essere stato errato, magari te la cavi velocemente con un flag.

Ciao
Maui78 è offline   Rispondi citando il messaggio o parte di esso
 Rispondi


Wind Tre 'accende' il 5G Standalone in Italia: si apre una nuova era basata sui servizi Wind Tre 'accende' il 5G Standalone in Italia: s...
OPPO Find X9 Pro: il camera phone con teleobiettivo da 200MP e batteria da 7500 mAh OPPO Find X9 Pro: il camera phone con teleobiett...
DJI Romo, il robot aspirapolvere tutto trasparente DJI Romo, il robot aspirapolvere tutto trasparen...
DJI Osmo Nano: la piccola fotocamera alla prova sul campo DJI Osmo Nano: la piccola fotocamera alla prova ...
FUJIFILM X-T30 III, la nuova mirrorless compatta FUJIFILM X-T30 III, la nuova mirrorless compatta
Google Maps avrà una modalit&agra...
HONOR sta lavorando a uno smartphone con...
Thermaltake MAGFloe 360 Ultra ARGB Sync:...
Xiaomi 15T ora in super offerta su Amazo...
Si stringe il cerchio attorno a TP-Link ...
Amazon cambia i prezzi ancora una volta:...
Imperdibili i Google Pixel 10 a questi p...
Dyson OnTrac in super offerta su Amazon:...
Amazon: la nuova ondata di licenziamenti...
Questo portatile è un mostro: MSI...
Apple Watch Series 11 GPS + Cellular cro...
JBL Clip 5 in forte sconto su Amazon: lo...
Il nuovo top di gamma compatto di OnePlu...
Cresce il divario tra dispositivi elettr...
La missione con equipaggio Shenzhou-21 h...
Chromium
GPU-Z
OCCT
LibreOffice Portable
Opera One Portable
Opera One 106
CCleaner Portable
CCleaner Standard
Cpu-Z
Driver NVIDIA GeForce 546.65 WHQL
SmartFTP
Trillian
Google Chrome Portable
Google Chrome 120
VirtualBox
Tutti gli articoli Tutte le news Tutti i download

Strumenti

Regole
Non Puoi aprire nuove discussioni
Non Puoi rispondere ai messaggi
Non Puoi allegare file
Non Puoi modificare i tuoi messaggi

Il codice vB è On
Le Faccine sono On
Il codice [IMG] è On
Il codice HTML è Off
Vai al Forum


Tutti gli orari sono GMT +1. Ora sono le: 14:28.


Powered by vBulletin® Version 3.6.4
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Served by www3v