2010-02-03 63 views
1

我有一個用java編寫的簡單的web應用程序,它有Servlet訪問Mysql數據庫來生成報告。報告生成發生得非常頻繁。如何克服「java.sql.SQLException:太多連接」異常?

我正在使用apache commons DBCP連接到數據庫。我也總是在finally塊中關閉連接的明確性。但是我沒有明確地關閉我創建的語句和結果集。

我被迫重新啓動tomcat實例,每當我得到說「java.sql.SQLException:太多連接」的異常。

我該如何克服這個......我是否需要增加Mysql中的maxconnections?

任何幫助表示讚賞。

+0

你確定你的連接已關閉嗎? – 2010-02-03 16:46:43

+0

你有沒有試過ConnectionPool? – bhups 2010-02-03 16:47:04

回答

1
  • 是應關閉Statement S/ResultSet秒 - 這通常會引用原始JDBC Connection而非PooledConnection代理Connection由DBCP PooledDataSource返回。
  • 考慮使用C3P0而不是DBCP。
  • 考慮使用Spring來管理您的JDBC操作,您將永遠不必擔心這種事情。
+0

是的。由於第一點,我認爲真正的實際問題是Statements/ResultSets。當你關閉委託連接(實際上返回池的那個連接)時,它不會關閉它的底層實際連接(它想保留它)。所以RS和ST不會永遠關閉,並且資源已經耗盡。 我不知道C3P0是否有什麼可以自動克服的,但如果你照顧它,它必須工作得很好。用DBCP。 – helios 2010-02-03 17:35:02

+0

對不起 - 我關於C3P0的第二點是不相關的;您仍然需要正確關閉連接和所有語句/結果集。它似乎比DBCP更受歡迎(如果你搜索DBCP C3P0,你會明白我的意思)。 – Adamski 2010-02-03 20:37:15

0

我遇到同樣的問題。 Adamski提到使用Spring來管理JDBC連接。

我使用@Autowired EntityManager的EM 這裏是我的DAO示例代碼:

@Transactional(rollbackOn={Exception.class}) 
@Component 
public class CustomerDao { 
    private static final Logger LOGGER = LoggerFactory.getLogger(UserDao.class); 

    @Autowired 
    private EntityManager em; 

public Customer saveOrUpdateCustomer(Customer customer) { 

    Session session = em.unwrap(Session.class); 

    session.saveOrUpdate(customer); 

    return customer; 
    } 

Mysql的max_connection是151對300 併發用戶測試,我仍然得到太多的連接例外。