數據庫連接池
數據庫連接池是什麼,有什麼用?
連接池:就是創建一個容器,用於裝入多個Connection對象,在使用連接對象時,從容器中獲取一個Connection,使用完成後,在將這個Connection重新裝入到容器中。這個容器就是連接池。(DataSource)
也叫做數據源.
我們可以通過連接池獲取連接對象.
優點:
節省創建連接與釋放連接 性能消耗 ---- 連接池中連接起到複用的作用 ,提高程序性能
自定義連接池
- 創建一個MyDataSource類,在這個類中創建一個LinkedList
- 在其構造方法中初始化List集合,並向其中裝入5個Connection對象。
- 創建一個public Connection getConnection();從List集合中獲取一個連接對象返回.
- 創建一個 public void readd(Connection) 這個方法是將使用完成後的Connection對象重新裝入到List集合中.
代碼問題:
- 連接池的創建是有標準的.
在javax.sql包下定義了一個接口 DataSource
簡單說,所有的連接池必須實現javax.sql.DataSource接口,
我們的自定義連接池必須實現DataSource接口。 - 我們操作時,要使用標準,怎樣可以讓 con.close()它不是銷燬,而是將其重新裝入到連接池.
要解決這個問題,其本質就是將Connection中的close()方法的行爲改變。
怎樣可以改變一個方法的行爲(對方法功能進行增強)
1.繼承
2.裝飾模式
a.裝飾類與被裝飾類要實現同一個接口或繼承同一個父類
b.在裝飾類中持有一個被裝飾類引用
c.對方法進行功能增強。
3.動態代理
可以對行爲增強
Proxy.newProxyInstance(ClassLoacer ,Class[],InvocationHandler); - 結論:Connection對象如果是從連接池中獲取到的,那麼它的close方法的行爲已經改變了,不在是銷燬,而是重新裝入到連接池。
1.連接池必須實現javax.sql.DataSource接口。
2.要通過連接池獲取連接對象 DataSource接口中有一個 getConnection方法.
3.將Connection重新裝入到連接池 使用Connection的close()方法。
開源連接池
dbcp(瞭解)
- dbcp是apache的一個開源連接池。
要想使用DBCP連接池,要下載jar包
導入時要導入兩個
commons-dbcp-1.4.jar
commons-pool-1.5.6.jar - 關於dbcp連接池使用
1.手動配置(手動編碼)
BasicDataSource bds = new BasicDataSource();
// 需要設置連接數據庫最基本四個條件
bds.setDriverClassName("com.mysql.jdbc.Driver");
bds.setUrl("jdbc:mysql:///jdbc");
bds.setUsername("root");
bds.setPassword("abc");
// 得到一個Connection
Connection con = bds.getConnection();
2.自動配置(使用配置文件)
Properties props = new Properties();
FileInputStream fis = new FileInputStream("D:\\java1110\\workspace\\jdbc\\src\\dbcp.properties");
props.load(fis);
DataSource ds = BasicDataSourceFactory.createDataSource(props);
c3p0(必會)
- C3P0是一個開源的JDBC連接池,它實現了數據源和JNDI綁定,支持JDBC3規範和JDBC2的標準擴展。
目前使用它的開源項目有Hibernate,Spring等。 - c3p0與dbcp區別
dbcp沒有自動回收空閒連接的功能
c3p0有自動回收空閒連接功能 - c3p0連接池使用
1.導包
c3p0-0.9.1.2.jar
2.使用
1.手動
ComboPooledDataSource cpds = new ComboPooledDataSource();
cpds.setDriverClass("com.mysql.jdbc.Driver");
cpds.setJdbcUrl("jdbc:mysql:///jdbc");
cpds.setUser("root");
cpds.setPassword("abc");
2.自動(使用配置文件)
c3p0-config.xml
<?xml version="1.0" encoding="UTF-8"?>
<c3p0-config>
<default-config>
<property name="driverClass">com.mysql.jdbc.Driver</property>
<property name="jdbcUrl">jdbc:mysql:///jdbc</property>
<property name="user">root</property>
<property name="password">abc</property>
</default-config>
</c3p0-config>
c3p0的配置文件可以是properties也可以是xml.
c3p0的配置文件如果名稱叫做 c3p0.properties or c3p0-config.xml 並且放置在classpath路徑下(對於web應用就是classes目錄)
那麼c3p0會自動查找。
注意:我們其時只需要將配置文件放置在src下就可以。
使用:
ComboPooledDataSource cpds = new ComboPooledDataSource();
它會在指定的目錄下查找指定名稱的配置文件,並將其中內容加載。