Migrando do MySql: servidor MariaDB, fechando as conexões do cliente inesperadamente

Estamos no processo de migração do MySql para o MariaDB devido a motivos de licenciamento / uso comercial.

Substituímos com êxito o jar do conector do MySql pelo jar do cliente MariaDB (primeira alteração) e agora estamos tentando substituir o servidor MySql pelo servidor MariaDB sem alterar os arquivos de dados.

Todos os nossos aplicativos funcionam perfeitamente por cerca de 8 a 12 horas, após as quais vemos a seguinte exceção:


org.springframework.transaction.CannotCreateTransactionException: Could not open Hibernate Session for transaction; nested exception is org.hibernate.exception.JDBCConnectionException: Cannot open connection
Caused by:
org.hibernate.exception.JDBCConnectionException: Cannot open connection
        at org.hibernate.exception.SQLStateConverter.convert(SQLStateConverter.java:74)
        at org.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionHelper.java:43)
        at org.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionHelper.java:29)
        at org.hibernate.jdbc.ConnectionManager.openConnection(ConnectionManager.java:426)
        at org.hibernate.jdbc.ConnectionManager.getConnection(ConnectionManager.java:144)
        at org.hibernate.jdbc.JDBCContext.connection(JDBCContext.java:119)
        at org.hibernate.transaction.JDBCTransaction.begin(JDBCTransaction.java:57)
        at org.hibernate.impl.SessionImpl.beginTransaction(SessionImpl.java:1326)
        at org.springframework.orm.hibernate3.HibernateTransactionManager.doBegin(HibernateTransactionManager.java:494)
        at org.springframework.transaction.support.AbstractPlatformTransactionManager.getTransaction(AbstractPlatformTransactionManager.java:315)
        at org.springframework.transaction.interceptor.TransactionAspectSupport.createTransactionIfNecessary(TransactionAspectSupport.java:257)
        at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:102)
        at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:185)
        at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:209)
        at $Proxy4.getMessageCountByStatus(Unknown Source)
        at com.onmobile.cmfweb.monitoring.CmfMessagesMonitor.getMessageCounts(CmfMessagesMonitor.java:56)
        at sun.reflect.GeneratedMethodAccessor625.invoke(Unknown Source)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
        at java.lang.reflect.Method.invoke(Method.java:597)
        at org.springframework.util.MethodInvoker.invoke(MethodInvoker.java:270)
        at com.onmobile.cmfshare.MethodInvockingBean.invoke(MethodInvockingBean.java:28)
        at org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean$MethodInvokingJob.executeInternal(MethodInvokingJobDetailFactoryBean.java:212)
        at org.springframework.scheduling.quartz.QuartzJobBean.execute(QuartzJobBean.java:79)
        at org.quartz.core.JobRunShell.run(JobRunShell.java:203)
        at org.quartz.simpl.SimpleThreadPool$WorkerThread.run(SimpleThreadPool.java:520)
Caused by: java.sql.SQLNonTransientConnectionException: Could not connect to localhost:3306: unexpected end of stream, read 0bytes from 4
        at org.mariadb.jdbc.internal.SQLExceptionMapper.get(SQLExceptionMapper.java:136)
        at org.mariadb.jdbc.internal.SQLExceptionMapper.throwException(SQLExceptionMapper.java:106)
        at org.mariadb.jdbc.Driver.connect(Driver.java:114)
        at org.apache.commons.dbcp.DriverConnectionFactory.createConnection(DriverConnectionFactory.java:37)
        at org.apache.commons.dbcp.PoolableConnectionFactory.makeObject(PoolableConnectionFactory.java:290)
        at org.apache.commons.pool.impl.GenericObjectPool.borrowObject(GenericObjectPool.java:840)
        at org.apache.commons.dbcp.PoolingDataSource.getConnection(PoolingDataSource.java:95)
        at org.apache.commons.dbcp.BasicDataSource.getConnection(BasicDataSource.java:544)
        at org.springframework.orm.hibernate3.LocalDataSourceConnectionProvider.getConnection(LocalDataSourceConnectionProvider.java:81)
        at org.hibernate.jdbc.ConnectionManager.openConnection(ConnectionManager.java:423)
        ... 21 more
Caused by: org.mariadb.jdbc.internal.common.QueryException: Could not connect to localhost:3306: unexpected end of stream, read 0bytes from 4
        at org.mariadb.jdbc.internal.mysql.MySQLProtocol.connect(MySQLProtocol.java:509)
        at org.mariadb.jdbc.internal.mysql.MySQLProtocol.connect(MySQLProtocol.java:669)
        at org.mariadb.jdbc.internal.mysql.MySQLProtocol.<init>(MySQLProtocol.java:264)
        at org.mariadb.jdbc.Driver.connect(Driver.java:110)
        ... 28 more
Caused by: java.io.EOFException: unexpected end of stream, read 0bytes from 4
        at org.mariadb.jdbc.internal.common.packet.buffer.ReadUtil.readFully(ReadUtil.java:84)
        at org.mariadb.jdbc.internal.common.packet.buffer.ReadUtil.readFully(ReadUtil.java:92)
        at org.mariadb.jdbc.internal.common.packet.RawPacket.nextPacket(RawPacket.java:77)
        at org.mariadb.jdbc.internal.common.packet.SyncPacketFetcher.getRawPacket(SyncPacketFetcher.java:67)
        at org.mariadb.jdbc.internal.mysql.MySQLProtocol.connect(MySQLProtocol.java:467)
        ... 31 more

As exceções desaparecem se o servidor MySql for usado novamente.

Pelo que depurei até agora, o servidor MariaDB está fechando as conexões do cliente por algum motivo. Inicialmente, suspeitei de conexões inativas, mas estamos usando configurações do Hibernate como 'testOnBorrow', portanto não deve ser o caso.

Alguém pode nos ajudar a descobrir a causa disso e nos ajudar a resolver o problema? Existe alguma configuração específica no MariaDB que eu deveria estar fazendo?

Até executei nossos aplicativos aumentando o valor do parâmetro 'interactive_timeout' no servidor MariaDB, mas isso não ajudou.

Btw, estamos usando o Spring-Hibernate e agrupando nossas conexões usando o jar do pool de Commons.

Qualquer tipo de ajuda será profundamente apreciado.

Resposta 1

Encontramos o mesmo problema recentemente, devido a uma combinação de parâmetros incorretos. Este erro é causado por sua instância da web tentando usar uma conexão que não é mais válida.

Isso pode ser resolvido, certificando-se de que os seguintes parâmetros estejam corretos:

  1. Você tem um validationQuery configurado para sua conexão com o banco de dados. ou seja, validationQuery="SELECT 1"no caso de mariadb, na configuração do servidor.
  2. Você tem o wait_timeout definido como um valor razoável. 8 horas keepAlive parece um pouco otimista, agora estamos usandowait_timeout=180
  3. Certifique-se de que validationInterval, que você também pode definir na configuração do servidor (server.xml no caso de uma configuração do tomcat), esteja definido como um valor menor que o valor wait_timeout. Reduzi o wait_timeout para 15s em um caso, com o valor validationInterval sendo mais alto que o que causava o erro ainda aparecer às vezes. Agora está definido como validationInterval=60, combinado com o wait_timeout=180que deve capturar todas as conexões interrompidas no tempo.
Resposta: 2

Eu também tive um erro como este Could not connect to localhost:3306: unexpected end of stream, read 0 bytes from 4

Minha arquitetura era um webapp do Tomcat que estava inserindo dados no MariaDB.

Eu estava usando o conector versão 1.5.1RC ! Eu mudei para a versão do conector 1.3.1 e agora funciona bem!

Resposta: 3

Eu também enfrentei esse problema. O problema desaparece com a redução do wait_timeout.

SHOW SESSION VARIABLES LIKE 'wait_timeout'; ->> would be 8 hours. which is huge.
SET session wait_timeout=300; ->> this should fix the issue.
Resposta: 4

Olhe para a

SHOW VARIABLES LIKE 'max_connections';
SHOW GLOBAL STATUS LIKE '%connect%';

Compare os valores my.cnf entre os dois sistemas; você pode ver uma diferença em coisas como acima que fazem a diferença. Se o problema ainda não for óbvio, forneça esses valores para uma discussão mais aprofundada.

Resposta: 5

De acordo com as descobertas deste artigo, você pode se safar de duas opções:

  1. Você deve tentar innodb_file_per_tabledesligar

    ou...

  2. Aumentar os limites de arquivos abertos, informa o valor atual da sua máquina $ ulimit -n, se você estiver executando em máquinas de alta especificação

Resposta: 6

Estou tentando enviar um email usando o servidor de email da minha empresa. Mas estou recebendo a seguinte exceção Causada por: com.sun.mail.smtp.SMTPSendFailedException: 530 5.7.1 O cliente não foi autenticado ...

Estou tentando depurar o aplicativo java no Visual Studio Code e obtendo o seguinte erro: "Erro: spawn jdb ENOENT". O código Vs está sugerindo a atualização do meu launch.json, que possui o seguinte: {"...

Possível duplicado: escapando dos arquivos de propriedades do sinal de igual Em um arquivo .properties, posso usar o caractere '=' após o primeiro? Assim: url = http: //www.example.org/test= É permitido ...

Estou precisando de um contêiner que possa manipular chaves duplicadas como o multimap C ++. Embora exista uma implementação conhecida no Guava, eu gostaria de algo da API Java padrão. Obrigado em ...