Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

tomcat 7.0.42 pooling, hibernate 4.2, solução mysql rock solid autorreconnect


Excelente pergunta. Eu costumo lutar com essa pergunta. A resposta mais comum no stackoverflow é "Depende..." para praticamente todos os problemas. Eu odeio dizer isso, mas em nenhum lugar isso é mais relevante do que ajustar seu pool de conexões. Realmente é um jogo de oferta e demanda, onde suas solicitações de conexão são a demanda e a oferta é o número de conexões que o MySQL tem disponível. Realmente se resume a saber se sua principal preocupação é impedir que conexões obsoletas sejam retornadas do pool ou se sua preocupação é garantir que o MySQL não esteja sobrecarregado com conexões ociosas porque você não as elimina com rapidez suficiente. A maioria das pessoas deita no meio em algum lugar.

Se você realmente entende por que alguém escolheria qualquer configuração de pool de conexão, acredite, você parará de procurar a configuração "Rocket Solid" porque saberá que é como pesquisar no Google um plano de negócios para sua loja; Está totalmente enraizado em quantas solicitações de conexão você recebe e quantas conexões persistentes você está disposto a disponibilizar. Abaixo, dou exemplos de por que você usaria determinadas configurações. Faço referência a variáveis ​​que você terá que alterar dentro da tag "Resource" da tag "Context" do seu arquivo Context.xml. Uma configuração completa de amostra pode ser vista na parte inferior.

Tráfego baixo

Nessa situação, você tem poucas solicitações para seu aplicativo, portanto, há uma boa chance de TODAS as conexões em seu pool de conexões ficarem obsoletas e a primeira solicitação de seu aplicativo por uma conexão obsoleta causará um erro. (Dependendo do driver MySQL que você está usando, o erro pode explicar que o último pacote recebido com sucesso excedeu a configuração wait_timeout do banco de dados). Portanto, sua estratégia de pool de conexões é impedir que uma conexão inativa seja retornada. As duas opções a seguir têm pouco efeito colateral para um site de baixo tráfego.

  • Espere mais antes de encerrar as conexões - Você faria isso alterando o valor de wait_timeout na sua configuração do MySQL. No ambiente de trabalho do MYSQL, você pode encontrar essa configuração facilmente em Admnin> Arquivo de configuração> Rede. Para um site com muito tráfego, isso geralmente não é recomendado porque pode levar o pool sempre a ser preenchido com muitas conexões ociosas. Mas lembre-se que este é o cenário de baixo tráfego.

  • Testar cada conexão - Você pode fazer isso definindo testOnBorrow = true e validationQuery= "SELECT 1" . E quanto ao desempenho? Você tem baixo tráfego nesta situação. Testar cada conexão retornada do pool não é um problema. Tudo o que isso significa é que uma consulta adicional será adicionada a cada transação MySQL que você estiver realizando em uma única conexão. Em um site de baixo tráfego, isso é realmente algo que você vai se preocupar? O problema de suas conexões ficarem inativas no pool porque não estão sendo usadas é seu foco principal.

Tráfego médio
  • Verifique todas as conexões periodicamente -Se você não quiser testar cada conexão toda vez que for usada, ou estender o tempo limite de espera, poderá testar periodicamente todas as conexões com uma consulta padrão ou personalizada de sua escolha. Por exemplo, defina validationQuery = "SELECT 1" , testWhileIdle = "true" e timeBetweenEvictionRunsMillis = "3600" ou qualquer intervalo que você quiser. Para tráfego muito baixo, isso exigirá mais trabalho. Pense nisso. Se você tiver 30 conexões no pool e em 1 hora apenas 4 forem chamadas, poderá verificar facilmente todas as 4 conexões em cada solicitação usando o testOnBorrow anterior abordagem com pouco impacto no desempenho. Mas se, em vez disso, você fizer a abordagem "Verificar tudo a cada hora", você fará 30 solicitações para verificar todas as conexões quando apenas4 foram usadas.

Tráfego alto
  • Elimine conexões inativas mais cedo - Esta é a situação em que todos dizem que você não deve estender o wait_timeout e não deve testar todas as conexões. Não é um modelo ideal para todas as situações. Quando você tiver tráfego significativo, todas as conexões no pool serão utilizadas e seu problema real se tornará o aumento do número de conexões disponíveis enquanto na verdade diminui a duração do seu wait_time para que você não acabe com muitas conexões ociosas no banco de dados. Aqui está um exemplo de um sujeito falando sobre como ele tem até 10.000 conexões ociosas por dia para um site ocupado, então ele quer diminuir o wait_timeout Reduzindo o wait_timeout para site ocupado

Amostra de configuração Context.xml
<Context>   

<Resource name="jdbc/TestDB"
          auth="Container"
          type="javax.sql.DataSource"
          factory="org.apache.tomcat.jdbc.pool.DataSourceFactory"
          testWhileIdle="true"
          testOnBorrow="true"
          testOnReturn="false"
          validationQuery="SELECT 1"
          validationInterval="30000"
          timeBetweenEvictionRunsMillis="30000"
          maxActive="100"
          minIdle="10"
          maxWait="10000"
          initialSize="10"
          removeAbandonedTimeout="60"
          removeAbandoned="true"
          logAbandoned="true"
          minEvictableIdleTimeMillis="30000"
          jmxEnabled="true"
          jdbcInterceptors="org.apache.tomcat.jdbc.pool.interceptor.ConnectionState;
            org.apache.tomcat.jdbc.pool.interceptor.StatementFinalizer"
          username="root"
          password="password"
          driverClassName="com.mysql.jdbc.Driver"
          url="jdbc:mysql://localhost:3306/mysql"/>
</Context>

Amostra de configuração web.xml
<web-app xmlns="http://java.sun.com/xml/ns/j2ee"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee
http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"
    version="2.4">
  <description>MySQL Test App</description>
  <resource-ref>
      <description>DB Connection</description>
      <res-ref-name>jdbc/TestDB</res-ref-name>
      <res-type>javax.sql.DataSource</res-type>
      <res-auth>Container</res-auth>
  </resource-ref>
</web-app>

Documentação sobre as propriedades do Tomcat Pool para ajustar o Tomcat Pool