sql >> Databasteknik >  >> RDS >> Mysql

tomcat 7.0.42 pooling, hibernate 4.2, mysql rock solid autoreconnect-lösning

Utmärkt fråga. Jag brukade kämpa med den här frågan. Det vanligaste svaret på stackoverflow är "Det beror på..." för praktiskt taget alla problem. Jag hatar att säga det men ingenstans är det mer relevant än att justera din anslutningspool. Det är verkligen ett spel av utbud och efterfrågan, där dina anslutningsförfrågningar är efterfrågan och utbudet är antalet anslutningar som MySQL har tillgängliga. Det handlar verkligen om huruvida ditt primära problem är att förhindra att inaktuella anslutningar returneras från poolen, eller om din oro är att säkerställa att MySQL inte överbelastas med lediga anslutningar eftersom du inte dödar dem snabbt nog. De flesta ligger någonstans i mitten.

Om du verkligen förstår varför någon skulle välja en anslutningspoolkonfiguration så tro mig, du kommer sluta söka efter inställningen "Rocket Solid" eftersom du kommer att veta att det är som att googla efter en affärsplan för din butik; Det är helt förankrat i hur många anslutningsförfrågningar du får och hur många ihållande anslutningar du är villig att göra tillgängliga. Nedan ger jag exempel på varför du skulle använda vissa inställningar. Jag refererar till variabler som du måste ändra i "Resource"-taggen i "Context"-taggen i din Context.xml-fil. Ett exempel på en fullständig konfiguration kan ses längst ner.

Låg trafik

I den här situationen har du få förfrågningar till din applikation så det finns en god chans att ALLA anslutningar i din anslutningspool blir inaktuella och den första begäran från din applikation med en inaktuell anslutning kommer att orsaka ett fel. (Beroende på vilken MySQL-drivrutin du använder kan felet förklara att det senast mottagna lyckade paketet översteg databasens inställning för wait_timeout). Så din anslutningspoolstrategi är att förhindra att en död anslutning returneras. Följande två alternativ har liten bieffekt för en webbplats med låg trafik.

  • Vänta längre innan du avbryter anslutningar - Du skulle göra detta genom att ändra värdet på wait_timeout i din MySQL-konfiguration. I MYSQL workbench kan du enkelt hitta den inställningen under Admnin> Konfigurationsfil> Nätverk. För en webbplats med mycket trafik rekommenderas detta inte ofta eftersom det kan leda till att poolen alltid fylls med massor av lediga anslutningar. Men kom ihåg att detta är scenariot med låg trafik.

  • Testa varje anslutning - Du kan göra detta genom att ställa in testOnBorrow = true och validationQuery= "SELECT 1" . Hur är det med prestanda? Du har låg trafik i den här situationen. Att testa varje anslutning som returneras från poolen är inget problem. Allt det betyder är att en ytterligare fråga kommer att läggas till varje MySQL-transaktion du utför på en enda anslutning. På en webbplats med låg trafik är detta verkligen något du kommer att oroa dig för? Problemet med att dina anslutningar försvinner i poolen för att de inte används är ditt primära fokus.

Medellång trafik

  • Kontrollera alla anslutningar med jämna mellanrum -Om du inte vill testa varje anslutning varje gång den används, eller förlänga väntetiden, kan du med jämna mellanrum testa alla anslutningar med en standard- eller anpassad fråga som du väljer. Ange till exempel validationQuery = "SELECT 1" , testWhileIdle = "true" , och timeBetweenEvictionRunsMillis = "3600" eller vilket intervall du vill. För mycket låg trafik kommer detta absolut att kräva mer arbete. Tänk på det. Om du har 30 anslutningar i poolen och bara 4 blir uppringda inom 1 timme, så kunde du enkelt ha kontrollerat alla 4 anslutningarna på varje förfrågan med den tidigare testOnBorrow tillvägagångssätt med liten prestationsträff. Men om du istället gör "Kontrollera alla varje timme"-metoden så gör du 30 förfrågningar om att kontrollera alla anslutningar när endast 4 användes.

Hög trafik

  • Döda lediga anslutningar förr - Det här är situationen som får alla att säga att du inte ska förlänga wait_timeout och att du inte ska testa varje anslutning. Det är inte en modell som är idealisk för alla situationer. När du har betydande trafik kommer varje anslutning i poolen att utnyttjas och ditt faktiska problem kommer att bli att öka antalet tillgängliga anslutningar samtidigt som längden på din wait_time faktiskt förkortas så att du inte hamnar på många lediga anslutningar på DB. Här är ett exempel på en kille som pratar om hur han har upp till 10 000 lediga anslutningar per dag för en upptagen webbplats så han vill sänka wait_timeout Sänker wait_timeout för upptagen webbplats

Exempel på Context.xml-konfiguration

<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>

Exempel på web.xml-konfiguration

<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>

Dokumentation om Tomcat Pool-egenskaper för att justera Tomcat Pool




  1. Jag vill använda CASE-satsen för att uppdatera några poster i sql server 2005

  2. mySQL subquery limit

  3. Hur lagrar man flera objekt i en databaskolumn?

  4. Grundläggande DB-anslutningspool med Java och Tomcat 7