Excepção sqlrecuperável: excepção I / O: reinício da ligação

Ontem à noite saí do escritório com um programa Java escrito por mim. Ele deve inserir um monte de registros em nosso banco de dados da empresa (Oracle) usando uma conexão JDBC. Esta manhã, quando voltei ao trabalho, vi este erro (apanhado por um "try-catch"):

java.sql.SQLRecoverableException: I/O Exception: Connection reset
O programa escreveu quase todos os registos antes de receber este problema, mas e se acontecer mais cedo (minutos depois de eu sair do Escritório à noite)? Não consigo entender o que aconteceu, contactei a minha base de dados. o administrador e ele disseram que não havia nenhum problema específico na base de dados.

Alguma ideia do que aconteceu e o que posso fazer para o evitar?

Author: jstricker, 2011-05-24

6 answers

Isto significa simplesmente que algo na infra-estrutura ( DBMS ) decidiu parar de funcionar devido à indisponibilidade de recursos, etc. Não tem nada a ver com o seu código ou com o número de inserções. Você pode ler mais sobre problemas semelhantes aqui:

Isto pode não responder à tua pergunta, mas vais ter uma ideia do porquê. pode estar a acontecer. Você poderia discutir mais com o seu DBA e ver se há algo específico no seu caso.
 8
Author: kensen john, 2018-01-08 08:27:44

O erro ocorre em algumas distribuições RedHat. A única coisa que você precisa fazer é executar sua aplicação com o parâmetro java.seguranca.egd=ficheiro:/ / / dev / urandom:

java -Djava.security.egd=file:///dev/urandom [your command]
 15
Author: Nacho Soriano, 2016-09-05 14:18:15
Experimentámos estes erros de forma intermitente após a actualização de 11g para 12c e o nosso java estava em 1,6.

A solução para nós era actualizar java e jdbc de 6 para 7

export JAVA_HOME='/usr/java1.7'

export CLASSPATH=/u01/app/oracle/product/12.1.0/dbhome_1/jdbc/libojdbc7.jar:$CLASSPATH 
Vários dias depois, a ligação continua intermitente.

Acabámos por remover todos os java 7 acima. Java 6 estava bem. O problema foi corrigido adicionando isso ao nosso usuário bash_profile.

Os nossos scripts fixes que estavam a experimentar o erro estavam a usar o /dev / random no nosso VM em lote. servidor. Abaixo forçou java e groovy a usar /dev / urandom.

Exportar JAVA_OPTS= " $JAVA_OPTS-Djava.seguranca.egd=ficheiro:/ / / dev / urandom "

 4
Author: Liz, 2015-03-19 19:29:32
Quero apresentar uma resposta complementar da solução de nacho-soriano...

Procuro recentemente resolver um problema onde uma aplicação escrita em Java (uma tarefa de Talend, de facto) quer ligar-se a uma base de Dados Oracle (11g e mais) e depois falhar aleatoriamente. OS é RedHat Enterprise e CentOS. Job run very quily in time (no more than half a minute) and occur very often (approximately one run each 5 minutes).

Algumas vezes, durante a noite como tempo de trabalho, durante uso intensivo de banco de dados como uso preguiçoso de trabalho, em apenas uma palavra aleatoriamente, a conexão falha com esta mensagem:
Exception in component tOracleConnection_1
java.sql.SQLRecoverableException: Io exception: Connection reset
        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:465)
        at java.sql.DriverManager.getConnection(DriverManager.java:664)
        at java.sql.DriverManager.getConnection(DriverManager.java:208)
    and StackTrace follow ...
Explicação do problema:

, Conforme detalhado aqui

A ligação Oracle precisa de números aleatórios para assumir um bom nível de segurança. Linux random number generator produce some numbers bases keyboard and mouse activity (among others) and place them in a stack. Você vai me conceder, em um servidor, não há uma grande quantidade de tal atividade. Para que possa ocorrem que softwares usam mais número aleatório do que o gerador pode produzir.

Quando a piscina estiver vazia, as leituras de/dev / random irão bloquear até que seja recolhido ruído ambiental adicional. E a conexão Oracle cai no tempo-limite (60 segundos por padrão).

Solução 1-específica para uma solução app

A solução é adicionar dois parâmetros ao JVM ao iniciar:

-Djava.security.egd=file:/dev/./urandom
-Dsecurerandom.source=file:/dev/./urandom

Nota: O '/.é importante, não a deixes cair !

A linha de comandos de lançamento poderá ser:

java -Djava.security.egd=file:/dev/./urandom -Dsecurerandom.source=file:/dev/./urandom -cp <classpath directives> appMainClass <app options and parameters>

Uma desvantagem desta solução é que os números gerados são um pouco menos seguros como a aleatoriedade é impactada. Se você não trabalha em uma indústria militar ou secreta relacionada esta solução pode ser sua.

Solução 2-solução geral jvm Java

Como explicado aqui

Ambas as directivas dadas na solução 1 podem ser colocadas no ficheiro de configuração de segurança Java.

Olha para isto.$JAVA_HOME/jre/lib/security/java.security [7] linha
securerandom.source=file:/dev/random

A

securerandom.source=file:/dev/urandom

A mudança produz efeitos imediatamente para novas aplicações em execução.

Quanto à solução #1, uma desvantagem desta solução é que os números gerados são um pouco menos seguros como a aleatoriedade é impactada. Desta vez, é um impacto global da JVM. Quanto à solução nº 1, Se você não trabalhar em uma indústria militar ou secreta relacionada esta solução pode ser sua.

Solução 3-Solução de Hardware

Declaração de exoneração de Responsabilidade: não estou ligado para qualquer fornecedor de hardware ou produto ...

Se a sua necessidade é atingir um nível de aleatoriedade de alta qualidade, você pode substituir o seu software de gerador de números aleatórios Linux por um pedaço de hardware.

Algumas informações estão disponíveis aqui.

Relativamente a

Thomas

 4
Author: tdaget, 2018-04-11 12:57:10

Solução
Altere a configuração da sua aplicação, de modo a que este parâmetro[-Djava.seguranca.egd=file: / dev/../dev / urandom ] ao lado do comando java:

Java -Djava.seguranca.egd=file: / dev/../dev / urandom [o seu comando]

Ref :- https://community.oracle.com/thread/943911

 3
Author: user3886907, 2016-08-30 17:38:53

A tua excepção diz que é tudo "reinicialização da ligação". A conexão entre o seu processo java e o servidor db foi perdida, o que poderia ter acontecido por quase qualquer razão(como problemas de rede). O Sqlrecuperável apenas significa que é recuperável, mas a causa principal é a reinicialização da ligação.

 1
Author: Suraj Chandran, 2011-05-24 12:36:43