Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Marvel's Wolverine, la recensione: Logan torna protagonista in un'avventura brutale e intensa
Marvel's Wolverine, la recensione: Logan torna protagonista in un'avventura brutale e intensa
Marvel's Wolverine porta Logan in un'avventura inedita, violenta e fortemente narrativa, costruita attorno alla sua natura di combattente e al difficile rapporto con il proprio passato. Insomniac Games punta su combattimenti spettacolari, progressione e personalizzazione, inserendo l'azione in un mondo segnato dalla persecuzione dei mutanti. Un viaggio intenso, che alterna mattanza, esplorazione e momenti sorprendentemente emotivi.
DJI Romo 2: tante novità lo rendono un robot completo
DJI Romo 2: tante novità lo rendono un robot completo
Romo 2 è la seconda generazione di robot lavapavimenti di DJI, un modello che si caratterizza per la precisione nel sistema di navigazione e per il funzionamento particolarmente silenzioso. Con le modifiche introdotte in questa seconda versione, e un posizionamento di prezzo più allineato alla concorrenza, rappresenta una valida alternativa sul mercato delle soluzioni di pulizia domestica
Sony Bravia 9 II: il True RGB alla prova, dove l'LCD sfida l'OLED
Sony Bravia 9 II: il True RGB alla prova, dove l'LCD sfida l'OLED
Il primo Sony con retroilluminazione True RGB alla prova del banco di misura e dei contenuti: luminanza enorme, colori accurati in HDR e un antiriflesso molto efficace. I limiti sono due sole HDMI 2.1 e il blooming fuori asse
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 03-06-2014, 15: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, 15: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, 13: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, 21: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, 05: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, 18: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


Marvel's Wolverine, la recensione: Logan torna protagonista in un'avventura brutale e intensa Marvel's Wolverine, la recensione: Logan torna p...
DJI Romo 2: tante novità lo rendono un robot completo DJI Romo 2: tante novità lo rendono un ro...
Sony Bravia 9 II: il True RGB alla prova, dove l'LCD sfida l'OLED Sony Bravia 9 II: il True RGB alla prova, dove l...
Geely EX5, un mese al volante: il SUV elettrico cinese che ci ha sorpreso (quasi) senza riserve Geely EX5, un mese al volante: il SUV elettrico ...
Mova Z70 Ultra Roller Complete: motore potente, rullo di lavaggio e l'IA a guidare Mova Z70 Ultra Roller Complete: motore potente, ...
Servizi in streaming sempre più c...
Anteprima della Leapmotor B03X: inizia l...
Anthropic accusa la Cina: Claude utilizz...
I satelliti Rassvet (Starlink russo) di ...
Un agente IA ha risolto un problema su W...
Cina: la CMSA potrebbe cambiare parte de...
68 mensilità di bonus per i dipen...
Rocket Lab ha fatto ricorso contro la de...
Nutanix rende disponibile Azure Virtual ...
Il padrino del deep learning avverte: gl...
Il finto avviso "iPhone Storage is Full"...
Dietrofront in Cina, addio touchscreen p...
Un piccolo accessorio trasforma lo smart...
Dopo 370 anni il Cyphral Distich non è p...
Oppo Find X10, X10 Pro Max e X10 E: conf...
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: 18:35.


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