Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Tastiera gaming MSI GK600 TKL: switch hot-swap, display LCD e tre modalità wireless
Tastiera gaming MSI GK600 TKL: switch hot-swap, display LCD e tre modalità wireless
MSI FORGE GK600 TKL WIRELESS: switch lineari hot-swap, tripla connettività, display LCD e 5 strati di fonoassorbimento. Ottima in gaming, a 79,99 euro
DJI Osmo Pocket 4: la gimbal camera tascabile cresce e ha nuovi controlli fisici
DJI Osmo Pocket 4: la gimbal camera tascabile cresce e ha nuovi controlli fisici
DJI porta un importante aggiornamento alla sua linea di gimbal camera tascabili con Osmo Pocket 4: sensore CMOS da 1 pollice rinnovato, gamma dinamica a 14 stop, profilo colore D-Log a 10 bit, slow motion a 4K/240fps e 107 GB di archiviazione integrata. Un prodotto pensato per i creator avanzati, ma che convince anche per l'uso quotidiano
Sony INZONE H6 Air: il primo headset open-back di Sony per giocatori
Sony INZONE H6 Air: il primo headset open-back di Sony per giocatori
Il primo headset open-back della linea INZONE arriva a 200 euro con driver derivati dalle cuffie da studio MDR-MV1 e un peso record di soli 199 grammi
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


Tastiera gaming MSI GK600 TKL: switch hot-swap, display LCD e tre modalità wireless Tastiera gaming MSI GK600 TKL: switch hot-swap, ...
DJI Osmo Pocket 4: la gimbal camera tascabile cresce e ha nuovi controlli fisici DJI Osmo Pocket 4: la gimbal camera tascabile cr...
Sony INZONE H6 Air: il primo headset open-back di Sony per giocatori Sony INZONE H6 Air: il primo headset open-back d...
Nutanix cambia pelle: dall’iperconvergenza alla piattaforma full stack per cloud ibrido e IA Nutanix cambia pelle: dall’iperconvergenza alla ...
Recensione Xiaomi Pad 8 Pro: potenza bruta e HyperOS 3 per sfidare la fascia alta Recensione Xiaomi Pad 8 Pro: potenza bruta e Hyp...
Una denuncia getta ombre sulle batterie ...
DJI Avata 2 Fly Smart Combo a 526€: il d...
Alla guida della nuova auto elettrica ci...
GeForce RTX 3060 12 GB a giugno di nuovo...
Apple Music sarà sponsor ufficiale di Po...
The Mandalorian & Grogu: trailer fin...
Fedeltà record: Apple blinda gli utenti,...
Volkswagen ID.3 Neo: fino a 630 km di au...
GPU-Z mette i dati personali a rischio? ...
La PS6 potrebbe essere retrocompatibile ...
Amazfit Cheetah 2 Pro arriva in Italia: ...
Duolingo ammette l'errore dopo un anno: ...
Samsung Galaxy Tab S10 Lite a 249€: il t...
Samsung Micro RGB: la rivoluzione del co...
Sempre più autonomia per gli smar...
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: 17:20.


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