Home > Java, Oracle > Dica: Erro Got minus one from a read call Oracle e Java (JBoss, Weblogic)

Dica: Erro Got minus one from a read call Oracle e Java (JBoss, Weblogic)

Problema

Se algum se depararem com um erro de I/O conectando no banco de dados Oracle (outros BD) via application server (JBoss, Weblogic):

Java.sql.SQLRecoverableException: Io exception: Got minus one from a read call
at oracle.jdbc.driver.SQLStateMapping.newSQLException(SQLStateMapping.java:101)
at oracle.jdbc.driver.DatabaseError.newSQLException(DatabaseError.java:112)
at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:173)
at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:229)
at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:458)
at oracle.jdbc.driver.T4CConnection.logon(T4CConnection.java:411)
at oracle.jdbc.driver.PhysicalConnection.<init>(PhysicalConnection.java:490)
at oracle.jdbc.driver.T4CConnection.<init>(T4CConnection.java:202)
at oracle.jdbc.driver.T4CDriverExtension.getConnection(T4CDriverExtension.java:33)
at oracle.jdbc.driver.OracleDriver.connect(OracleDriver.java:474)
at oracle.jdbc.pool.OracleDataSource.getPhysicalConnection(OracleDataSource.java:275)
at oracle.jdbc.xa.client.OracleXADataSource.getPooledConnection(OracleXADataSource.java:454)

Esse erro indica que a conexão foi fechada pelo outro lado da conexão, trata-se de um erro de IO. A questão é porque o banco de dados encerraria as conexões?

Quando estamos trabalhando com o Oracle um dos principais motivos para esse comportamento é a falta de conexões/sessions no Oracle. Para consultar no Oracle o número de sessões disponíveis usar a seguinte query:

SELECT
‘Currently, ‘
|| (SELECT COUNT(*) FROM V$SESSION)
|| ‘ out of ‘
|| VP.VALUE
|| ‘ connections are used.’ AS USAGE_MESSAGE
FROM
V$PARAMETER VP
WHERE VP.NAME = ‘sessions’;

O próximo passo é comparar o tamanho dos Datasources configurados, provavelmente ocorreu pois o número máximo do pool do conexões do datasource é maior do que o número máximo da configuração do Oracle.

Solução

É necessário ajustar as sessões máximas do Oracle ou diminuir o tamanho do pool do Datasource. Veremos abaixo como aumentar o número de sessões no Oracle para 2000.

  1. Acessar o SQLPlus com o usuário sys.
  2. Executar os comandos abaixo:
    SQL> alter system set sessions=5000 scope=spfile;
    System altered 
    SQL> alter system set processes=5000 scope=spfile;
    System altered
  3. Para as alterações fazerem enfeito é necessário reiniciar o banco de dados.
  4. Ainda no SQLPlus executar:
    SQL> shutdown immediate
     Database closed.
     Database dismounted.
     ORACLE instance shut down.
  5. Em seguida reiniciar o banco:SQL> startup ORACLE instance started.
    Total System Global Area 4275781632 bytes 
    Fixed Size 2235208 bytes 
    Variable Size 1862272184 bytes 
    Database Buffers 2382364672 bytes 
    Redo Buffers 28909568 bytes 
    Database mounted. 
    Database opened.

Pronto agora que os valores estão compatíveis esse erro não deve ocorrer mais.

Categories: Java, Oracle Tags: , , ,
  1. No comments yet.
  1. No trackbacks yet.

Leave a comment