簡體   English   中英

與JDBC到MySQL的持久連接

[英]A persistent connection with JDBC to MySQL

我有一個使用JDBC連接到MySQL的應用程序。 有些情況下,JDBC連接閑置數小時(甚至幾天),並且它失去了與MySQL的連接,然后在嘗試執行查詢時排除。 什么是最好的解決方案?

在一段時間內保持連接打開是一種不好的做法。 當DB打開很長時間時,DB會強制關閉。 您應該編寫JDBC代碼,以便它始終關閉您獲取它們的同一個try塊的finally塊中的連接(以及語句和結果集),以防止資源泄漏。

但是,在每次打嗝時獲取連接確實是一項非常昂貴的任務,因此您希望使用連接池 體面的連接池將自行管理打開,測試,重用和關閉連接。 但這並不意味着您可以將JDBC代碼更改為永不關閉它們。 您仍然需要關閉它們,因為這實際上會將底層連接釋放回池中以供將來重用。

有幾個連接池,比如Apache DBCP ,它是單線程的,因此性能很差, C3P0是多線程的,性能更好,而Tomcat JDBC適用於你使用Tomcat並且不想使用內置DBCP的情況表現不好。

您可以通過編程方式創建連接池,這是C3P0的示例:

ComboPooledDataSource dataSource = new ComboPooledDataSource();
dataSource.setDriverClass("com.mysql.jdbc.Driver");
dataSource.setJdbcUrl("jdbc:mysql://localhost:3306/dbname");
dataSource.setUser("username");
dataSource.setPassword("password"); 

在應用程序啟動期間執行一次,然后您可以按如下方式使用它:

Connection connection = null;
// ...

try {
    connection = dataSource.getConnection();
    // ...
} finally {
    // ...
    if (connection != null) try { connection.close(); } catch (SQLException ignore) {}
}

當你在一個支持JNDI的容器(如servletcontainer)(例如Tomcat)中運行時,你也可以將它聲明為java.sql.DataSource這里是 Tomcat特定的手冊)。 然后它將使用servletcontainer提供的連接池設施。 然后,您可以按如下方式獲取數據源:

DataSource dataSource = (DataSource) new InitialContext().lookup("java:comp/env/jdbc/YourDataSourceName");

有些庫,例如Apache的DBCP ,可以進行連接池。 部分原因是它們可以設置為在您使用它時自動測試連接(例如“SELECT NOW()FROM DUAL”或其他無害的東西)並在必要時自動重新建立連接,允許您申請假裝連接是永恆的。

點擊這里:

基本上,您應該使用DataSource並在使用之前始終執行getConnection()。 除非出現嚴重錯誤,否則DataSource會在必要時重新連接。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM