2017-09-05 38 views
2

我們目前在我們的生產服務器上存在一個主要問題。我們在一臺服務器上安裝了MySQL DB(Ubuntu 14.04和MySQL 5.5.57版)。由於存在很多連接錯誤,MySQL主機被阻止

我們有另一臺服務器,所有應用程序都與服務器上的數據庫進行通話。連續5天,現在我們保持第二的服務器上獲取此錯誤:

05-09-2017 00:00:01 WARN com[email protected]623841b8 -- Acquisition Attempt Failed!!! Clearing pending acquires. While trying to acquire a needed new resource, we failed to succeed more than the maximum number of allowed acquisition attempts (30). Last acquisition attempt exception: 
com.mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConnectionException: Could not create connection to database server. Attempted reconnect 3 times. Giving up. 
    at sun.reflect.GeneratedConstructorAccessor32.newInstance(Unknown Source) 
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) 
    at java.lang.reflect.Constructor.newInstance(Constructor.java:408) 
    at com.mysql.jdbc.Util.handleNewInstance(Util.java:411) 
    at com.mysql.jdbc.Util.getInstance(Util.java:386) 
    at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1015) 
    at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:989) 
    at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:975) 
    at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:920) 
    at com.mysql.jdbc.ConnectionImpl.connectWithRetries(ConnectionImpl.java:2395) 
    at com.mysql.jdbc.ConnectionImpl.createNewIO(ConnectionImpl.java:2316) 
    at com.mysql.jdbc.ConnectionImpl.<init>(ConnectionImpl.java:834) 
    at com.mysql.jdbc.JDBC4Connection.<init>(JDBC4Connection.java:47) 
    at sun.reflect.GeneratedConstructorAccessor19.newInstance(Unknown Source) 
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) 
    at java.lang.reflect.Constructor.newInstance(Constructor.java:408) 
    at com.mysql.jdbc.Util.handleNewInstance(Util.java:411) 
    at com.mysql.jdbc.ConnectionImpl.getInstance(ConnectionImpl.java:416) 
    at com.mysql.jdbc.NonRegisteringDriver.connect(NonRegisteringDriver.java:347) 
    at com.mchange.v2.c3p0.DriverManagerDataSource.getConnection(DriverManagerDataSource.java:146) 
    at com.mchange.v2.c3p0.WrapperConnectionPoolDataSource.getPooledConnection(WrapperConnectionPoolDataSource.java:195) 
    at com.mchange.v2.c3p0.WrapperConnectionPoolDataSource.getPooledConnection(WrapperConnectionPoolDataSource.java:184) 
    at com.mchange.v2.c3p0.impl.C3P0PooledConnectionPool$1PooledConnectionResourcePoolManager.acquireResource(C3P0PooledConnectionPool.java:200) 
    at com.mchange.v2.resourcepool.BasicResourcePool.doAcquire(BasicResourcePool.java:1086) 
    at com.mchange.v2.resourcepool.BasicResourcePool.doAcquireAndDecrementPendingAcquiresWithinLockOnSuccess(BasicResourcePool.java:1073) 
    at com.mchange.v2.resourcepool.BasicResourcePool.access$800(BasicResourcePool.java:44) 
    at com.mchange.v2.resourcepool.BasicResourcePool$ScatteredAcquireTask.run(BasicResourcePool.java:1810) 
    at com.mchange.v2.async.ThreadPoolAsynchronousRunner$PoolThread.run(ThreadPoolAsynchronousRunner.java:648) 
    Caused by: java.sql.SQLException: null, message from server: "Host 'IP_ADDRESS' is blocked because of many connection errors; unblock with 'mysqladmin flush-hosts'" 
    at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1078) 
    at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:989) 
    at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:975) 
    at com.mysql.jdbc.MysqlIO.doHandshake(MysqlIO.java:1114) 
    at com.mysql.jdbc.ConnectionImpl.coreConnect(ConnectionImpl.java:2493) 
    at com.mysql.jdbc.ConnectionImpl.connectWithRetries(ConnectionImpl.java:2334) 

我們一直在努力爲5天,以解決這個問題,但我們每次重啓MySQL的幾個小時的時間,然後錯誤再次啓動。我把max_connect_errors從10提高到了50,但這只是延長了錯誤。

然後我們也調整了日誌級別爲2,但我們在錯誤日誌中唯一看到的是中止連接,沒有'拒絕'連接。

有沒有什麼辦法可以看到實際的連接錯誤?請幫忙解決這個問題,我不知道如何解決。我們也沒有DBA,所以它只是一個不是數據庫專家的開發團隊。

編輯:該應用程序是一個Java Maven應用程序,使用休眠連接到數據庫。這裏是hibernate的配置文件:

<hibernate-configuration> 
<session-factory> 
    <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property> 
    <property name="hibernate.connection.username">USERNAME_HERE</property> 
    <property name="hibernate.connection.password">PASSWORD_HERE</property> 
    <property name="hibernate.connection.url">jdbc:mysql://SERVER_HERE:3306/voda_soccer?zeroDateTimeBehavior=convertToNull</property> 
    <property name="hibernate.connection.autoReconnect">true</property> 
    <property name="hibernate.dialect">org.hibernate.dialect.MySQLInnoDBDialect</property> 
    <property name="hibernate.temp.use_jdbc_metadata_defaults">false</property> 
    <property name="show_sql">false</property> 

    <property name="hibernate.c3p0.min_size">5</property> 
    <property name="hibernate.c3p0.max_size">20</property> 
    <property name="hibernate.c3p0.timeout">300</property> 
    <property name="hibernate.c3p0.max_statements">50</property> 
    <property name="hibernate.c3p0.idle_test_period">3000</property> 

    <mapping class="com.myapp.sms.producer.entity.Customer"></mapping> 
    <mapping class="com.myapp.sms.producer.entity.Gifting"></mapping> 
    <mapping class="com.myapp.sms.producer.entity.BulkCampaign"></mapping> 
</session-factory> 

我們總是在finally塊緊密的聯繫:

} finally { 
     if (session != null) { 
      try { 
       session.close(); 
      } catch (Exception e) {} 
     } 
     session = null; 
    } 

我知道我們可以刷新主機或重啓MySQL,但我不能這樣做所有的時間都在生產服務器上。我想知道爲什麼我們會收到連接錯誤以及在哪裏看到它們?

+0

你是否關閉了你的連接? –

+0

您是否在多個線程之間共享您的Connection對象,這些對象不是線程安全的 – Ferrybig

+0

另請參閱https://stackoverflow.com/questions/22285318/how-to-unblock-with-mysqladmin-flush-hosts –

回答

0

看起來存在連接泄漏,或者您可能需要很長時間的運行查詢來阻止其他代碼段獲取連接。

根據您使用的數據源工具(c3p0,hikari等),您可以通過jmx(jsconsole,visual vm)監控您的池。您可以使用Flexy Pool進行一些監控。

Mysql工作臺還提供了一些有用的工具,以便獲取有關負責的操作的更多信息。

相關問題