2011-07-07 221 views
1

我必須使用SQLite數據庫實現連接池和標準JDBC DAO。實現連接池的最簡單方法是重用數據庫連接以減少Web應用程序的開銷?這裏是我編碼:JDBC和連接池選項

package persistance; 

import java.sql.Connection; 
import java.sql.DriverManager; 
import java.sql.ResultSet; 
import java.sql.SQLException; 
import java.sql.Statement; 

public class SQLite { 

    Connection conn = null; 
    Statement stat = null; 

    public SQLite(String path) { 
     String dbPath = path + "GTI525.db"; 
     System.out.println(dbPath); 
     try { 
      Class.forName("org.sqlite.JDBC"); 
      conn = DriverManager.getConnection("jdbc:sqlite:" + dbPath); 
      stat = conn.createStatement(); 
     } catch (SQLException e) { 
      e.printStackTrace(); 
     } catch (ClassNotFoundException e) { 
      e.printStackTrace(); 
     } 
    } 

    public ResultSet query(String sql) { 
     ResultSet rs = null; 
     try { 
      rs = stat.executeQuery(sql); 
     } catch (SQLException e) { 
      e.printStackTrace(); 
     } 
     return rs; 
    } 
} 
+0

最簡單的事情就是不要寫一個 –

回答

2

正如其他人所提到的,您可能需要考慮一些預建解決方案。然而,如果你想要最簡單的自定義池實現,你可以使用一個合理大小的圓形數組,例如100。然後,只需要使用SQLite對象填充它,並在它的前面放置一些仲裁器,以便將查詢移交給數組中的對象。喜歡的東西:

public ResultSet runQuery(String sql) { 
    SQLite connection = null; 

    synchronized(this) { 
     connection = connectionArray[currentIndex]; 
     currentIndex++; 
     if (currentIndex >= connectionArray.length) { 
      currentIndex = 0; 
     } 
    } 

    return connection.query(sql); 
} 

然而在實踐中,存在分配開放100個連接,直到應用程序實際上需要很多意義不大。因此,您可能希望至少在您的SQLite類中添加isBusy()方法,並實施您的仲裁器類,以便它搜索不是破產的第一個SQLite並使用該方法,僅在分配新方法時所有現有的實例都很忙(並且只有在數組中仍然有空間用於新的實例時)。

您可能還希望您的SQLite類驗證連接仍在query()中打開,因爲大多數數據庫如果閒置時間過長會關閉連接。這至少偶爾會在連接池中發生。

+0

難道你不需要使用JNDI數據源嗎?如果連接正在使用,我們是否必須將其從池中移除? –

0

使用直接的JDBC和創建自己的連接池是不更時尚!

我強烈建議查看ORM實現,例如休眠。然後您可以將C3P0插入到提供連接池的C3P0中。

這些問題已經解決,不再有趣的解決。編寫自己的連接池將很難正確,難以測試。除非你有強烈的寫作自己的理由,否則我強烈推薦Hibernate和C3P0。