2013-12-23 5 views
13

Mein Fehler finden können:ORA-12516 TNS: Zuhörer nicht verfügbar Handler

java.sql.SQLException: Listener refused the connection with the following error: 

ORA-12516, TNS:listener could not find available handler with matching protocol 
stack 
The Connection descriptor used by the client was: 
//10.2.5.21:9001/XE 

     at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java 
:112) 
     at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java 
:261) 
     at oracle.jdbc.driver.T4CConnection.logon(T4CConnection.java:387) 
     at oracle.jdbc.driver.PhysicalConnection.<init>(PhysicalConnection.java: 
414) 
     at oracle.jdbc.driver.T4CConnection.<init>(T4CConnection.java:165) 
     at oracle.jdbc.driver.T4CDriverExtension.getConnection(T4CDriverExtensio 
n.java:35) 
     at oracle.jdbc.driver.OracleDriver.connect(OracleDriver.java:801) 
     at oracle.jdbc.pool.OracleDataSource.getPhysicalConnection(OracleDataSou 
rce.java:297) 
     at oracle.jdbc.pool.OracleDataSource.getConnection(OracleDataSource.java 
:221) 
     at oracle.jdbc.pool.OracleDataSource.getConnection(OracleDataSource.java 
:165) 
     at utilityService.DB_util.setOracleConnectionActive(DB_util.java:99) 
     at utilityService.DB_util.getRecPreparedAuthentication(DB_util.java:124) 

Meine gemeinsame DB-Verbindung Klasse:

package utilityService; 

import java.sql.CallableStatement; 
import java.sql.Connection; 
import java.sql.PreparedStatement; 
import java.sql.ResultSet; 
import java.sql.SQLException; 
import java.sql.Statement; 

import oracle.jdbc.pool.OracleDataSource; 


public class DB_util { 
    String propValue = ""; 
    ResultSet rec = null; 
    Statement stm = null; 
    PreparedStatement pre_stm = null; 
    CallableStatement call_stm = null; 
    Connection conn1 = null; 

    /** 
    * Constructure to get oracle connection 
    */ 
    public DB_util() { 

     Util util=new Util(); 
     propValue=util.getFilePathToSave(); 
     //propValue = Util.propValue;// get oracle connection 
     setOracleConnectionActive(); 
    } 

    /** 
    * Close all oracle connections and result sets. 
    */ 
    public void setOracleConnectionClose() { 
     try { 
      if (conn1 != null || !conn1.isClosed()) { 
       if (rec != null) { 
        rec.close(); 
        rec = null; 
       } 
       if (stm != null) { 
        stm.close(); 
        stm = null; 
       } 
       if (pre_stm != null) { 
        pre_stm.close(); 
        pre_stm = null; 
       } 
       if (call_stm != null) { 
        call_stm.close(); 
        call_stm = null; 
       } 
       conn1.commit(); 
       conn1.close(); 
       conn1 = null; 
      } 
     } catch (Exception ex) { 
      ex.printStackTrace(); 
     } 
    } 

    /** 
    * return a result set according to sql sent 
    * 
    * @param SQL 
    * @return 
    */ 
    public ResultSet getRec(String SQL) { 
     try { 
      setOracleConnectionActive(); 
      stm = conn1.createStatement(); 
      rec = stm.executeQuery(SQL); 

      return rec; 
     } catch (Exception ex) { 
      ex.printStackTrace(); 
      return rec; 
     } 

    } 

    /** 
    * Activate oracle connection 
    */ 
    private void setOracleConnectionActive() { 
     try { 
      if (conn1 == null || conn1.isClosed()) { 
       OracleDataSource ods = new OracleDataSource(); 
       if (propValue != null) { 
        ods.setURL(propValue); 
       } 
       conn1 = ods.getConnection(); 
       System.out.println("DB connection CONNECTED......"); 
       conn1.setAutoCommit(false); 
      } 
     } catch (Exception ex) { 
      //setOracleConnectionActive(); 
      ex.printStackTrace(); 
      System.out.println("DB connection FAILED......"); 
     } 
    } 

    /** 
    * send prepared result set with user authenticate 
    * 
    * @param SQL 
    * @param strInputUserMobile 
    * @param strInputUserName 
    * @param strInputUserPassword 
    * @return 
    */ 
    public ResultSet getRecPreparedAuthentication(String SQL, 
      String strInputUserMobile, String strInputUserName, 
      String strInputUserPassword) { 

     try { 
      setOracleConnectionActive(); 
      pre_stm = conn1.prepareStatement(SQL); 
      pre_stm.setString(1, strInputUserMobile); 
      pre_stm.setString(2, strInputUserName); 
      pre_stm.setString(3, strInputUserPassword); 
      rec = pre_stm.executeQuery(); 

      return rec; 
     } catch (Exception ex) { 
      ex.printStackTrace(); 
      return rec; 
     } 

    } 

    /** 
    * insert sql to db which is send as a sql 
    * 
    * @param SQL 
    * @return 
    */ 
    public int insertSQL(String SQL) { 
     int output = 0; 
     try { 
      setOracleConnectionActive(); 
      stm = conn1.createStatement(); 
      output = stm.executeUpdate(SQL); 
      conn1.commit(); 
      output = 1; 

     } catch (Exception ex) { 
      try { 
       conn1.rollback(); 
       output = 0; 
      } catch (SQLException e) { 
       e.printStackTrace(); 
       output = 0; 
      } 
      ex.printStackTrace(); 

     } 
     return output; 

    } 

    /** 
    * Send a callable statement according to sent sql 
    * 
    * @param SQL 
    * @return 
    */ 
    public CallableStatement callableStatementSQL(String SQL) { 

     int output = 0; 
     try { 
      setOracleConnectionActive(); 
      call_stm = conn1.prepareCall(SQL); 

     } catch (Exception ex) { 
      try { 
       conn1.rollback(); 
       output = 0; 
      } catch (SQLException e) { 
       e.printStackTrace(); 
       output = 0; 
      } 
      ex.printStackTrace(); 

     } 
     return call_stm; 

    } 

} 

Jede Transaktion ich diese Klasse beziehe und tue mein Holen & CRUD Operationen. Gibt es ein Problem mit meinem Code?

+2

Was gibt 'util.getFilePathToSave()' Ihnen - klingt, als wäre es ein Dateipfad anstelle einer JDBC-URL, aber dann würden Sie keinen Fehler vom Listener bekommen. Erhalten Sie diesen Fehler sofort oder nachdem er einige Operationen ausgeführt hat - vielleicht schließen Sie nicht Ihre Verbindungen und der Listener/DB läuft keine Prozesse mehr? –

+0

danke liebe Alex.its gibt jdbc url.i werde überprüfen, dass meine Verbindung öffnen und schließen –

Antwort

20

Sie haben viele Verbindungen geöffnet und das ist das Problem. Ich denke in deinem Code hast du die geöffnete Verbindung nicht geschlossen.

Ein Datenbank-Bounce kann vorübergehend gelöst werden, wird jedoch bei einer fortlaufenden Ausführung wieder angezeigt. Außerdem sollte die Anzahl der gleichzeitigen Verbindungen zur Datenbank überprüft werden. Wenn der Parameter für maximale DB-Prozesse erreicht wurde, ist dies ein häufiges Symptom.

mit freundlicher Genehmigung von diesem Thema: https://community.oracle.com/thread/362226?tstart=-1

10

Ich reparierte dieses Problem mit SQL-Befehlszeile ein:

connect system/<password> 
alter system set processes=300 scope=spfile; 
alter system set sessions=300 scope=spfile; 

Restart-Datenbank.

+0

Ich tat dies aber auch überprüft, wie meine Anwendung verhielt. In meinem Fall wurde ein Verbindungspool verwendet, um Objekte über einen dblink zu verwenden. Es wird kein explizites Commit/Session-Close durchgeführt, der Prozess bleibt bestehen und das Limit ist erreicht. Ein MinimumIdle = 0 im Pool zu lassen löste das eigentliche Problem. – Alfabravo

Verwandte Themen