Datenbank-Link Problem

  1. jdbc Verbindungsfehler

       错误 表现: ERROR cmjeecwcCrmEtlSourceController - syncCrmData senden Fehler msg: konnte nicht geöffnet werden JDBC-Verbindung für die Transaktion; verschachtelte Ausnahme ist com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Kommunikationsfehler verknüpfen.

       Analyse: Letzte 4 Tage gibt es eine Menge Daten dieses Problem. Der Grund dafür ist, dass die Betriebs- und Wartungspersonal die Parameter einzustellen. Durch die Abfrage: zeigen globale Variablen wie ‚% Timeout‘, wobei es wait_timeout 28800s = 8h. Davor 300s. Die Bedeutung dieser Parameter ist: wenn eine MySQL-Verbindung gefunden 300s nicht verwenden. Um diese Verbindung zu verwerfen. Die Verbindung selbst und JDBC-Verbindung (1) mysql-Sitzung Verbindungsinformationen gespeichert. (2) jdbc Datenbankverbindungspool wird die Verbindung nicht wissen, ist abgelaufen. Wenn es versucht, zu re-connect mysql Zeit, wird der obige Fehler gemeldet werden.

       So gibt es mehrere Lösungen.

      a. Ändern Sie den mysql my.cnf wird die Ablaufzeit für 1 Jahr. Starten Sie dann die Datenbank.

          [mysqld]
          wait_timeout=31536000
          interactive_timeout=31536000

     b. Vorschlag.

         Wir können eine Datenbankverbindungspool validateQuery, testOnBorrow (testOnReturn) geöffnet sein, so dass vor jedem aus dem Verbindungspool entfernt und ist einsatzbereit (oder Verwendung vor dem Ziel und in dem Verbindungspool platziert), die derzeit beim ersten Test verwendet wird, ist einfach zu bedienen, wenn schwer zu bedienen, destory das System automatisch aus.

Oder testWhileIdle Artikel ist festgelegt, ob Hintergrundthread in regelmäßigen Abständen ermöglichen überprüft die Verfügbarkeit der Verbindung Pool-Verbindung. c3p0 und Druide hat Parameter.

     c.mysql5.0 bisher verwendeten.

        Konfigurieren der Verbindungs-URL in jdbc, können Sie „autoReconnect = true“ anhängen, aber das funktioniert nur MySQL5 früheren Versionen.

Hinweis:

Da ich zur Zeit die Umwelt habe, ist jetzt ein Netzwerk von Back-Office-Systemen, I die Anzahl der Benutzer in weniger als 50, dann wait_timeout den Standard 8 Stunden, c3p0 nicht die Gültigkeit der Verbindung überprüfen, ist alles in Ordnung ist.

Und ich eine anderes EPG - Rezeption - Management - System, in weniger als 3 Millionen Abonnenten, wenn ich 8 Stunden wait_timeout, dann habe ich auf die Spitzenzeit ist , tot sein sicher, es wird zu viel von einer TCP - Verbindung nicht geschlossen ist ,
die Datenbankverbindungen sicherlich nicht genug.

 

       Da dieses Problem häufig auftritt, wenn jdbc Verbindung. Ich begann begegnet Mysql verwenden. Es ist notwendig, wieder induktiver Wissen Punkte niedrigen Verbindungspool verwendet.

       (1) Warum gibt es einen Verbindungspool? - Um die Leistung zu verbessern. In dem Webapplikations - System, wenn die JSP , die Servlet oder EJB Verwendung JDBC direkt den Datenzugriff in einer Datenbank, muss jede Datenzugriffsanforderungen Datenbankverbindung zu unterziehen, öffnen die Datenbank, Schritt den Datenzugriff, und schließen Sie die Datenbankverbindungen, und sind mit offenen verbunden beide Datenbank ist eine ressourcenintensive und zeitraubende Arbeit, wenn eine solche Datenbank - Operationen häufig auftreten, wird ein starker Rückgang der Leistung an das System gebunden ist , und sogar dazu führen , das System zum Absturz bringen. Datenbankverbindungspool , das Basisangebot dieser Technologie: Technologie dieses Problem am häufigsten verwendete Methode in vielen Anwendungsserver (Weblogic, WebSphere, JBoss zum Beispiel) zu lösen.

       (2) Die derzeit verfügbaren Datenbankverbindungspool (JDBC) Was? c3p0, dbcp, proxool, sowie inländische Druide.

                  dbcp ist eine Abhängigkeit Jakarta Commons-Pool-Objekt Poolingmechanismus .DBCP Datenbankverbindungspool kann direkt in der Anwendung verwendet werden, Tomcat ist die Quelldaten unter Verwendung von DBCP. Hibernate offiziell bekannt gegeben, dass aufgrund der vielen Bug nicht mehr DBCP unterstützt und empfohlen Proxool oder C3P0.

                  c3p0 ist ein Open-Source-JDBC Connection-Pool, der mit Hibernate im Verzeichnis lib verteilt wird, einschließlich einer Verbindung und Statement Pool Datasources Objekts jdbc2 Implementierung jdbc3 und erweiterten Spezifikationen beschrieben.

                  proxool ist eine Java-Datenbankverbindungspool-Technologie. Ein Open-Source-Projekt bei Source bietet dieses Projekt einen robusten, einfach zu bedienen Connection Pooling, die kritischste ist die Connection-Pool-Funktion dient zur Überwachung, einfach zu bedienen, leicht Anschluss undicht Fall zu finden.

                  Diese drei sind die am häufigsten verwendeten JDBC Connection Pool.

                 Druide nur eine JDBC-Verbindung Pool, ferner eine ProxyDriver umfasst. Eine Reihe von JDBC-Komponenten-Bibliothek, ein SQL-Parser. Druid von Mysql Oracle und machte eine spezielle Optimierung, wie beispielsweise Oracle PS Cache Speicher-Footprint-Optimierung, MySql Erkennung von Ping-Optimierung.

                 Druiden SQL Parser bietet vollständige Unterstützung für MySQL, Oracle, PostgreSQL, SQL in SQL-92, die eine High-Performance-SQL Parser Handschrift ist, die Unterstützung der Besucher-Muster, so dass die Analyse von SQL abstrakte Syntaxbaum ist sehr praktisch. Simple SQL 30 Mikrosekunden, wenn die Anweisung innerhalb von 10 Mikrosekunden, mit komplexen SQL verwendet wird.

DRUID von SQL-Parser Schicht kann intercept SQL handeln entsprechend in JDBC, wie beispielsweise Unterbibliothek Untertabelle und Rechnungsprüfungs vorgesehen. Druide Verteidigung gegen SQL-Injection-Angriffe WallFilter durch die Semantik von SQL Parser Druide Analyse realisiert wird.

 

       (3) Auswahl Verbindungspool. Performance dbcp <= c3p0 <proxool Stabilität dbcp> = c3p0> proxool.

                 Derzeit mit dem Druiden mehr. Es kann in Betracht gezogen werden. Referenz: https://github.com/alibaba/druid/wiki/%E5%B8%B8%E8%A7%81%E9%97%AE%E9%A2%98

        (4) Konfiguration

                 c3p0

 1. eingeführte erstes JAR-Paket.

 2. XML-Anordnung

<!--<bean id="dataSourceTarget" abstract="true" class="com.mchange.v2.c3p0.ComboPooledDataSource" destroy-method="close">
<property name="driverClass" value="${jdbc.driver}" />
<property name="minPoolSize" value="${jdbc.minPoolSize}" />
<property name="maxPoolSize" value="${jdbc.maxPoolSize}" />
<property name="initialPoolSize" value="${jdbc.initialPoolSize}" />
<property name="maxIdleTime" value="${jdbc.maxIdleTime}" />
<property name="acquireIncrement" value="${jdbc.acquireIncrement}" />
<property name="checkoutTimeout" value="${jdbc.acquireCheckoutTimeout}" />
</bean>

&lt;!&ndash; 可以指定多个name,之间可以用分号(“;”)、空格(“ ”)或逗号(“,”)分隔开,如果没有指定id,那么第一个name为标识符,其余的为别名;若指定了id属性,则id为标识符,所有的name均为别名 &ndash;&gt;
<bean id="edp-dataSource" parent="dataSourceTarget" lazy-init="true">
<property name="jdbcUrl" value="${edp.jdbc.url}" />
<property name="user" value="${edp.jdbc.username}" />
<property name="password" value="${edp.jdbc.password}" />
</bean>→

3. Parameterwerte

jdbc.driver=com.mysql.jdbc.Driver
jdbc.initialPoolSize=10
jdbc.minPoolSize=10
jdbc.maxPoolSize=20
jdbc.maxIdleTime=2000
jdbc.acquireIncrement=5
jdbc.acquireCheckoutTimeout=3000

 

 

            Druide

     1. Einführung in eine JAR-Paket.    

<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.1.8</version>
</dependency>

  2.xml Datei-Konfiguration.

<bean id="edp-dataSource" class="com.alibaba.druid.pool.DruidDataSource"
destroy-method="close">
<!-- 数据库基本信息配置 -->
<property name="url" value="${edp.jdbc.url}" />
<property name="username" value="${edp.jdbc.username}" />
<property name="password" value="${edp.jdbc.password}" />
<property name="driverClassName" value="${jdbc.driver}" />
<!-- 借时检测是否空闲 -->
<property name="testWhileIdle" value="true" />
<!-- 每30秒运行一次空闲连接回收器 -->
<property name="timeBetweenEvictionRunsMillis" value="120000" />
<!-- 最大并发连接数 -->
<property name="maxActive" value="200" />
<!-- 初始化连接数量 -->
<property name="initialSize" value="30" />
<!-- 配置获取连接等待超时的时间 -->
<property name="maxWait" value="10000" />
<!-- 最小空闲连接数 -->
<property name="minIdle" value="30" />
</bean>

 

 

  dbcp - jd

<!-- Datasource -->
<bean id="dataSourceBackup" class="org.apache.commons.dbcp.BasicDataSource">
 <property name="driverClassName" value="${datasource.jdbc.driver}" />
 <property name="url" value="${datasource.jdbc.url}" />
 <property name="username" value="${datasource.jdbc.username}" />
 <property name="password" value="${datasource.jdbc.password}" />
 <property name="validationQuery" value="select 1" />
 <property name="testOnBorrow" value="true" />
 <property name="testOnReturn" value="false" />
 <property name="initialSize" value="5" />
 <property name="maxIdle" value="20" />
 <property name="minIdle" value="20" />
 <property name="maxActive" value="${datasource.jdbc.maxActive}" />
 <property name="removeAbandoned" value="true" />
 <property name="removeAbandonedTimeout" value="15" />
 <property name="maxWait" value="5000" />
 <property name="defaultAutoCommit" value="true" />
</bean>

 

2. Datenbank gespielt.

Ursache: Client-Bulk-Identifizierungs-System ist nicht normal.

Problem Analyseverfahren: Datenbank gefunden hohe CPU-Auslastung. Abfrage mysql-> zeigen volle PROCESS. Gefunden, dass Warte viele Aufgaben ausgeführt werden.

Lösung:

1. Starten Sie (nicht empfohlen).

Schalten Sie 2. die Aufgabe. Kill QUERY 4487855; KILL [CONNECTION | QUERY] thread_id

Veröffentlicht 12 Original - Artikel · erntete Lob 2 · Aufrufe 672

Ich denke du magst

Origin blog.csdn.net/gonghaiyu/article/details/103718898
Empfohlen
Rangfolge