2014-04-21 97 views
1

好吧,我改變我的連接工廠的代碼,我使用PoolProperties類,現在我收到此錯誤:太多的連接(新的錯誤)

Data source rejected establishment of connection, message from server: "Too many connections"

在我InsertandGetObject方法我日誌中的消息爲了測試連接是否關閉,我也在服務器上啓動了debbug。

這個問題的任何想法? :■

這是我的連接池:

public static Connection getConnection() throws DatabaseConnectionException { 

    PoolProperties p = new PoolProperties(); 
    p.setName("jdbc/MetaData"); 
    p.setUrl("jdbc:mysql://localhost:3306/db_name"); 
    p.setDriverClassName("com.mysql.jdbc.Driver"); 
    p.setUsername("root"); 
    p.setPassword(""); 
    p.setInitialSize(3); 
    p.setMaxActive(10); 
    p.setMaxIdle(8); 
    p.setMinIdle(2); 
    p.setRemoveAbandoned(true); 
    p.setMaxWait(10000); 

    Connection conn = null; 



    try { 

     DataSource dataSource = new org.apache.tomcat.jdbc.pool.DataSource(p); 

     conn = dataSource.getConnection(); 

    } catch (SQLException e) { 
     LOGGER.debug("MSJ SQLExp: " + e.getMessage()); 
     throw new DatabaseConnectionException(e); 

    } 

    return conn; 
} 

這是關閉連接的方法:

public Concept insertAndGetObject(Concept object) throws SQLException, 
     DatabaseConnectionException { 
    try { 

     connection = ConnectionFactory.getConnection(); 
     connection.setAutoCommit(false); 
     statement = connection.prepareStatement(INSERT_CONCEPTS); 
     statement = ConceptMapperUtil.setStatementParameters(statement, 
       object); 
     statement.executeUpdate(); 
     connection.commit(); 
     LOGGER.debug("Inserted concept row "); 
    } catch (SQLException e) { 
     connection.rollback(); 

     if (e.getErrorCode() == SQL_INSERT_ERROR_CODE) { 
      LOGGER.debug("Concept already exists!"); 
     } else { 
      throw e; 
     } 

    } finally { 
     object = findConceptByUniqueFk(object.dataSource.getIdDataSource(), 
       object.conceptType.getIdConcept(), 
       object.idMetadataVersion.getIdMetaDataVersion()); 
     DbUtil.close(statement); 
     // connection.setAutoCommit(true); 
     DbUtil.close(connection); 
    } 
    return object; 
} 
+1

與您的問題並不嚴格相關,但您爲什麼(1)在方法開始時沒有獲取「Concept」,以避免將異常用作「正常」業務邏輯(插入已有的概念是在您的流程中「正常」)和(2)在有可能拋出嚴重的SQLException並且您的連接處於無效狀態時,返回到finally子句中的數據庫?第二點甚至可以解釋你的問題,儘管我不能告訴你迄今爲止提供的信息。 –

+0

我做了一些改變,現在我得到這個錯誤,任何想法? – kennechu

+0

您的應用程序正在接收多少個請求(或同時請求)?您的數據庫被配置爲處理多少個同時連接?嘗試增加mysql允許的連接數(通過mysql管理員或編輯my.ini) –

回答

2

隨着new DataSource(PoolProperties)你不創建一個「數據源對象包裹的連接」(如ApiDocs中所述)。相反,你創建了一個連接池(也在ApiDocs中提到過,但在頂部:「DataSource只是包裝一個ConnectionPool ...」)。我驗證了這一點,我認爲是源代碼(請參閱DataSourceProxy的第108行)。因此,關閉一個Connection只會將它返回給池(這樣它可以重新使用),它並沒有真正關閉連接(除非您看到連接實際上在數據庫服務器上關閉,在這種情況下,I錯了)。解決方案是創建1個DataSource對象併爲每個getConnection()調用重新使用它。當應用程序不再需要數據庫連接時關閉DataSource/ConnectionPool。