Jboss mysql connessione

di il
4 risposte

Jboss mysql connessione

Salve a tutti sono nuovo del forum.
Sono programmatore java, e volevo chiedere a chiunque abbia utilizzato l'accoppiamento jboss e mysql, se è capitato quello che a me succede. Un'applicazione che gira correttamente dopo un pò di tempo un mese o due, a seconde della quantità di chiamate vengono effettuate, l'applicazione al momento della connessione al DB da un errore di tipo Null. Basta riavviare e rifunziona tutto correttamente. Cosa che non mi è mai capitata con Glassfish (in passato anche con tomcat mi succedeva). Qualcuno ha mai riscontrato tale problema.

Grazie a tutti, anche se temo che difficilmente otterrò una risposta, per la particolarità del problema.

4 Risposte

  • Re: Jboss mysql connessione

    gips71 ha scritto:


    al momento della connessione al DB da un errore di tipo Null.

    temo che difficilmente otterrò una risposta, per la particolarità del problema.
    Il punto è che detto così è altamente vago ed è praticamente impossibile dare una risposta valida!

    Cosa viene utilizzato in termini di librerie/framework per l'accesso al DB? Solo JDBC "puro"? Un ORM tipo Hibernate? Altro? Come è fatta la applicazione? C'è di mezzo un DataSource? Come è configurato l'accesso al DB? Hai del log che indica abbastanza chiaramente il punto incriminato?
  • Re: Jboss mysql connessione

    Scusate, in effetti non ho dato nessun riferimento

    Utilizzo mysql-connector-java_xxxx.jar come libreria. Ho creato in jboss un pool-connection che recupero con un lookup nell'applicazione nel seguente modo

    ...
    Context initContext;
    initContext = new InitialContext();
    DataSource ds = (DataSource) initContext.lookup(jindi);
    ....
    e con ds.getConnection() recupero la connessione per eseguire le query; ed è proprio in questo comando che restituisce l'errore, penso che ds.getConnection() restituisce null;

    Non so se le informazioni sono sufficienti per dare una risposta.
    Comunque dopo un tot numero di connessioni si impalla.E' come se finisse lo spazio disponibile per nuove connessioni e riavviando il server si resetta.
  • Re: Jboss mysql connessione

    gips71 ha scritto:


    Utilizzo mysql-connector-java_xxxx.jar come libreria.
    Questo ok ma vuol solo dire che il DB è MySQL e stai usando il suo driver JDBC. Ma non hai detto cosa usi, se direttamente la API JDBC oppure una libreria/framework di più alto livello. Comunque da quello che dici sotto, io deduco: solo JDBC puro (prendi tu la Connection dal DataSource, crei lo Statement, esegui, iteri su ResultSet, ecc...).

    gips71 ha scritto:


    e con ds.getConnection() recupero la connessione per eseguire le query; ed è proprio in questo comando che restituisce l'errore, penso che ds.getConnection() restituisce null;
    Le questioni sono (almeno) due: a) o il connection pool è bacato, non funziona bene, non è configurato bene ecc.. ...... oppure b) il tuo codice usa "male" JDBC.

    Se come ho dedotto prima hai usato direttamente JDBC, vuol dire che tutta la gestione dalla Connection in poi è a carico tuo. Vuol dire che il tuo codice deve: creare un Statement/PreparedStatement, eseguire la query, se è una query di SELECT, ottieni un ResultSet, iteri su questo, ecc....
    E in tutto questo, devi gestire ACCURATAMENTE le eccezioni e soprattutto i close delle risorse JDBC utilizzate.
    Devi arrivare a fare anche il close della Connection. Se c'è un connection pool, il close() sull'oggetto Connection NON "chiude" la connection, semplicemente la fa ritornare al connection pool, pronta per un'altra richiesta.

    Quindi: mostra il codice che USA la Connection e vediamo subito ....


    P.S. non è impossibile che un connection pool sia bacato o non funzioni bene (nessuno/niente è perfetto) .... ma tra le opzioni a e b, sono più propenso per la b).
  • Re: Jboss mysql connessione

    Ora il sorgente è un pò complicato poiché ho creato una classe astratta che gestisce connessione ed esecuzione query.
    Viene estesa da altre classi dove dichiaro solo la lista dei parametri le query da eseguire e la lista dei campi.

    metto un pezzo di questa classe i due costruttori il primo per query secche, il secondo per transazioni, dove il ds.getConnection() viene gestito da un'altra classe (transection) dove gestisco rollback commit e chiusura della connessione quando la transazione finisce.

    A seguire c'è un semplice metodo che fa una select dove si prevede che venga restituito solo un record (ho fatto vari metodi per eseguire le varie tipologie di select: con parametri, senza parametri, che restituisce più record).

    La gestione delle eccezioni non è il massimo (forse anche il modo di gestire tutta la parte DB )
    
    	public PoolADO(String jindi) throws NamingException {
    		try {
    			initContext = new InitialContext();
    			ds = (DataSource) initContext.lookup(jindi);
    			transection = false;
    		} catch (NamingException e) {
    			throw new NamingException("Errore nella connessione");
    		}
    		setParam();
    	}
    
    	public PoolADO(Connection conn) throws NamingException {
    		setParam();
    		transection = true;
    		this.conn = conn;
    	}
    
    	private Connection recuperaConnection() throws SQLException {
    		return transection ? conn : ds.getConnection();
    	}
    
    	public Object selectinBean() throws PoolDataTooManyRowException,
    			PoolDataNoDataFoundException {
    		Connection conn = null;
    		ResultSet rs = null;
    		Statement st = null;
    		Object ret = null;
    		try {
    			conn = recuperaConnection();
    			st = conn.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE,
    					ResultSet.CONCUR_READ_ONLY);
    			rs = st.executeQuery(getCompleteSql());
    
    			if (rs.next()) {
    				rs.next();
    				if (!rs.isAfterLast()) {
    					throw new PoolDataTooManyRowException("Troppi record trovati");
    				} else {
    					rs.previous();
    					ret = getCampi(rs);
    				}
    			} else { // norow throw new
    				throw new PoolDataNoDataFoundException("Nessun dato trovato");
    			}
    		} catch (SQLException e) {
    			e.printStackTrace();
    		} finally {
    			try {
    				rs.close();
    			} catch (final SQLException e) {
    			}
    			try {
    				st.close();
    			} catch (final SQLException e) {
    			}
    			if (!transection) {
    				try {
    					conn.close();
    				} catch (final SQLException e) {
    				}
    			}
    		}
    		return ret;
    	}
    
    se vuoi ti invio i sorgenti completi che si occupano della parte
Devi accedere o registrarti per scrivere nel forum
4 risposte