ピット列のCentOS7-MySQLのコース一度覚えておいてください

まず、エラーの原因と

今日mysql5.7がCentOS7にインストールし、データベースが成功したかどうかをテストするために、環境を構成、彼が参加し、操作ベースのJava WebプログラムMyBatisの+春のmysqlデータベースを書いたので、それのいくつかは、人々が迷惑なエラーや物語を感じて起こります:

プログラムは、クエリなどのデータベースでの操作になると、挿入して、他の操作、アクセスする最初のブラウザが非常に遅くなり、プログレスバーが回転した場合、ページが500エラーを報告します:org.mybatis.spring.MyBatisSystemException:ネストされた例外はorg.apacheです.ibatis.exception。しかし、私はCentOS7で何の問題は、MySQLサーバとWindowsのローカルのNavicatを接続しないで持っています。

MySQLのイルカ

デバッグの第二に、プロセス

1. SQL文を確認してください

これは間違ったMyBatisのが原因と見ているように見える、そうなのJavaBean、このresultMapとしてフォーマット変換パラメータ、resultTypeとなど、SQL文のエラーでXMLマッパーは、定義する必要があるかどうかを確認し、その上のJavaBean DAOとの紹介。

検査は、すべての問題を見つけることができませんでしたと、エラーが解消されません。

2. MySQLのホストがあるため、多くの接続エラーのブロックされています。「mysqladminのフラッシュ・ホスト」でブロック解除报错

分析:

ビューTomcatはファイルを記録し、このエラーの初めに誤りがあった見つけました。お問い合わせの際、私は間違っていることがわかった理由は次のとおりです。生産が多すぎる(以上のMySQLデータベースmax_connection_errorsの最大値より)輻輳による短時間でのデータベース接続のIPで中断。

ソリューション:

CentOS7サーバーを入力します。

方法:せmax_connection_errors(緩和)の数を増加させます。

  1. ビューmax_connection_errorsにMySQLのデータベース: show variables like '%max_connection_errors%';
  2. max_connection_errors数が1000で変更します。 set global max_connect_errors = 1000;
  3. 修正が成功したかどうかを確認するには:show variables like '%max_connection_errors%';

方法2:使用するmysqladmin flush-hostshostsファイルをクリーンアップコマンドを:

  1. mysqladminのパスを検索します。whereis mysqladmin
  2. 以下のようなコマンドを、実行します。/usr/local/mysql5.5.35/bin/mysqladmin -uroot -pyourpwd flush-hosts

注意:方法2は、hostsファイルをクリーンアップする、あなたはまた、コマンドを実行してMySQLデータベースに直接行くことができます:mysql> flush hosts;

ホストの問題を解決するため、Tomcatのログファイルに、エラーが始まり、このエラーの出現で発見されました。

 com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Communications link failure

The last packet successfully received from the server was 32 milliseconds ago.  The last packet sent successfully to the server was 32 milliseconds ago.
    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
    at java.lang.reflect.Constructor.newInstance(Constructor.java:423)
    at com.mysql.jdbc.Util.handleNewInstance(Util.java:425)
    at com.mysql.jdbc.SQLError.createCommunicationsException(SQLError.java:990)
    ......

分析:

これは、プログラムが、接続が失敗したことのMySQLとの通信に失敗したことを示します。成功し、サーバから受信した最後のパケットは、mysqlは接続が失われ、再接続を表し、32ミリ秒前のことでした。データベース接続のため、このリサイクル問題がアイドル状態の後、プログラムはデータベース操作を行うために待っている間に、MySQLの接続が出て閉じていることを発見し、データベース接続をオープンします。

私はタイムアウト問題を待つように接続されるかもしれないと思いました。レイテンシ(WAIT_TIMEOUT)接続されているMySQLの構成データベースにデフォルト値は8時間です。あなたは、MySQLで表示することができます。

mysql﹥ 
mysql﹥ show global variables like 'wait_timeout'; 
+---------------+---------+ 
| Variable_name | Value | 
+---------------+---------+ 
| wait_timeout | 28800 | 
+---------------+---------+ 
1 row in set (0.00 sec) 

8時間である28800秒。WAIT_TIMEOUT秒間、データベース接続(のjava.sql.Connection)が待機状態にあった場合、それは接続を閉じてのmysql。このとき、Javaアプリケーションの接続プールは、まだ法的に接続への参照を保持しています。データベース操作との接続は、上記のエラーが発生したとき。

MySQLの接続は、一度、彼らが成功する前に、需要はいつでも「握手」接続障害は障害が発生することがあり、6つの「ハンドシェイク」を通過します接続されています。3つの接続を確立するための第1の3方向ハンドシェイクは、単に必要なTCPハンドシェークとして理解することができる、MySQLは、スリーウェイハンドシェイクタイムアウトとCONNECT_TIMEOUT関連続い異なる実装のTCPプロトコルへのより対象を制御することができません。

ソリューション:

データベースパラメータを変更する最も簡単な方法(IN値な/etc/my.cnfを変更WAIT_TIMEOUT)であるが、データベース、大きな影響を再起動する必要があります。前提のデータベースパラメータを変更することなく、あなたは治療が行われていないことができます。

  • :次のような、追加のJDBC URLでJDBC、真の自動再=を使用している場合dataSource.url=jdbc:mysql://132.231.xx.xxx:3306/shop?useUnicode=true&characterEncoding=utf8&useSSL=true&autoReconnect=true

  • あなたは春にDBCP接続プールを使用している場合は、のような属性validationQueryデータソースとtestOnBorrow、の定義の増加:

    <bean id="vrsRankDataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
        <property name="driverClassName" value="${dataSource.driver}"/>
        <property name="url" value="${dataSource.url}"/>
        <property name="username" value="${dataSource.user}"/>
        <property name="password" value="${dataSource.password}"/>
        <property name="validationQuery" value="SELECT 1"/>
        <property name="testOnBorrow" value="true"/>
    </bean>
  • データソースが定義されている場合、接続プールC3P0スプリングを使用して、そのようなものとして、属性testConnectionOnCheckin testConnectionOnCheckoutを追加する場合:

    <bean name="cacheCloudDB" class="com.mchange.v2.c3p0.ComboPooledDataSource">
        <property name="driverClass" value="${dataSource.driver}"/>
        <property name="jdbcUrl" value="${dataSource.url}"/>
        <property name="user" value="${dataSource.user}"/>
        <property name="password" value="${dataSource.password}"/>
        <property name="initialPoolSize" value="10"/>
        <property name="maxPoolSize" value="10"/>
        <property name="testConnectionOnCheckin" value="false"/>
        <property name="testConnectionOnCheckout" value="true"/>
        <property name="preferredTestQuery" value="SELECT 1"/>
    </bean>

4.問題が遅いリモート接続のMysql

上記の接続タイムアウトで問題を解決しようとするが、と何かを見つけることができませんでした、または問題の上に表示されます。だから私は、リモート接続は、MySQLが接続タイムアウトにつながっ遅すぎるだろうか?私はCentOS7接続MySQLサーバとWindowsのローカルのNavicatで問題がないので。次のオンラインチェック、およびコンフィギュレーション/etc/my.cnfファイルmysqlの中で次の設定パラメータを追加することが見つかりました:

# 注意该配置是加在[mysqld]下面
[mysqld]
skip-name-resolve

その後、MySQLサービスを再起動する必要があります。指示に従ってそのため、MySQLのクエリとDNSホストを解決するには、低速接続が遅い場合や、多くのクライアントホストがある場合に発生する可能性があります起こすことができるかどうか。また、それが禁止されたドメイン名解決の結果であるため、設定パラメータの増加は、権限テーブルでホストフィールドは、MySQL、IPアドレスのみを使用することができるドメイン名を使用することはできませんのでご了承ください。

5.终极解决:データベース・サーバーへの接続を作成できませんでした。再接続を3回試みました。あきらめ报错

分析:

上記設定後、再テストプログラムは、このエラーが浮上しています。お問い合わせの際に、私は、これはSSLによる誤差によるものであることがわかりました。私はCentOS7新しくインストールされたMySQL5.7でのyumコマンドを使用していたので、MySQLのSSLのデフォルトの設定はありません。

私が使用してきたUbuntu16.04上のMySQLデータベースが、それはMySQLのSSLのデフォルトの設定ですので、私は、SSL暗号化を使用すること、と&useSslオプション=真の内部データベースへのJDBC接続でのURLに使用されています。私は、現在のMySQLに接続したときに原因、接続されていません。次のようにTomcatのエラーの終わりを見るためにログインすると、エラーは次のようになります。

Caused by: javax.net.ssl.SSLHandshakeException: java.security.cert.CertificateException: java.security.cert.CertPathValidatorException: Path does not chain with any of the trust anchors
    at sun.security.ssl.Alerts.getSSLException(Alerts.java:192)
    at sun.security.ssl.SSLSocketImpl.fatal(SSLSocketImpl.java:1946)
    at sun.security.ssl.Handshaker.fatalSE(Handshaker.java:316)
    at sun.security.ssl.Handshaker.fatalSE(Handshaker.java:310)
    at sun.security.ssl.ClientHandshaker.serverCertificate(ClientHandshaker.java:1639)
    at sun.security.ssl.ClientHandshaker.processMessage(ClientHandshaker.java:223)
    at sun.security.ssl.Handshaker.processLoop(Handshaker.java:1037)
    at sun.security.ssl.Handshaker.process_record(Handshaker.java:965)
    at sun.security.ssl.SSLSocketImpl.readRecord(SSLSocketImpl.java:1064)
    at sun.security.ssl.SSLSocketImpl.performInitialHandshake(SSLSocketImpl.java:1367)
    at sun.security.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1395)
    at sun.security.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1379)
    at com.mysql.jdbc.ExportControlled.transformSocketToSSLSocket(ExportControlled.java:186)
    ... 24 more
Caused by: java.security.cert.CertificateException: java.security.cert.CertPathValidatorException: Path does not chain with any of the trust anchors
    at com.mysql.jdbc.ExportControlled$X509TrustManagerWrapper.checkServerTrusted(ExportControlled.java:302)
    at sun.security.ssl.AbstractTrustManagerWrapper.checkServerTrusted(SSLContextImpl.java:1091)
    at sun.security.ssl.ClientHandshaker.serverCertificate(ClientHandshaker.java:1621)
    ... 32 more
Caused by: java.security.cert.CertPathValidatorException: Path does not chain with any of the trust anchors
    at sun.security.provider.certpath.PKIXCertPathValidator.validate(PKIXCertPathValidator.java:154)
    at sun.security.provider.certpath.PKIXCertPathValidator.engineValidate(PKIXCertPathValidator.java:80)
    at java.security.cert.CertPathValidator.validate(CertPathValidator.java:292)
    at com.mysql.jdbc.ExportControlled$X509TrustManagerWrapper.checkServerTrusted(ExportControlled.java:295)
    ... 34 more

それから私はなぜ理解しました。

ソリューション:

JDBC URLを設定するときに使用&useSslオプション=偽、つまりは、SSL暗号化を使用せずに、通常の接続が設定されています。

dataSource.url = jdbc:mysql://132.231.xx.xxx:3306/shop?useUnicode=true&characterEncoding=utf8&useSSL=false&autoReconnect=true

より高いデータセキュリティの提案は、MySQLの端に結合されたSSL中である場合。

第三に、要約

MySQLのSSLの問題は、一連の問題を引き起こしているため。SSL暗号化の問題は、MySQLの接続タイムアウトにプログラムを引き起こし、その後、短時間で結果本番データベース接続であまりにも多くの中断を阻止する同じIPにつながる、mysqlの接続に送信されているので。

エラーログを見た後、エラーの冒頭を見に加えて、我々はまた、エラーの終わりに見なければならない、この修正は、他のいくつかの調査結果になります。


PS:あなたは何かが悪い書かれた間違った記事、だと思う、または任意の提案がありましたら、アドバイスをしてください。

親指、コレクションへようこそとコメント!
(終わり)

おすすめ

転載: www.cnblogs.com/deecyn/p/11442319.html