JavaWeb07-HTML篇筆記(三)
傳統JDBC的操作,對連接的對象銷毀不是特別好.每次創建和銷毀連接都是需要花費時間.可以使用連接池優化的程序.
- 在程序開始的時候,可以創建幾個連接,將連接放入到連接池中.用戶使用連接的時候,可以從連接池中進行獲取.用完之後,可以將連接歸還連接池.
1.1.2 分析:1.1.2.1 技術分析:
【自定義連接池】(了解) - SUN公司提供了一個連接池的接口.(javax.sql.DataSource).
- 定義一個連接池:實現這個接口.
- 使用List集合存放多個連接的對象.
【自定義連接池的代碼】
public class MyDataSource implements DataSource{ // 創建一個List集合用於存放多個連接對象. private List<Connection> list = new ArrayList<Connection>(); // 在程序開始的時候,初始化幾個連接,將連接存放到list中. public MyDataSource() { // 初始化3個連接: for(int i=1;i<=3;i++){ Connection conn = JDBCUtils.getConnection(); list.add(conn); } } @Override // 獲得連接的方法: public Connection getConnection() throws SQLException { if(list.size() <= 0){ for(int i=1;i<=3;i++){ Connection conn = JDBCUtils.getConnection(); list.add(conn); } } Connection conn = list.remove(0); return conn; } // 歸還連接的方法: public void addBack(Connection conn){ list.add(conn); } ... }
【自定義連接池中問題及如何解決】
? 問題?
1.如果使用自定義連接池,那麽需要額外記住自定義連接池中的API.
2.能不能使用面向接口的編程方式.
? 解決:
不額外提供API方法,就可以解決上述兩個問題!!!
能不能還調用Connection的close方法.能不能增強Connection的close方法,原有的銷毀變為歸還!!!
? 如何增強Connection的close方法:
- 增強一個Java類中的某個方法有幾種方式???
- 一種方式:繼承的方式.
- 能夠控制這個類的構造的時候,才可以使用繼承.
- 二種方式:裝飾者模式方式.
- 包裝對象和被包裝的對象都要實現相同的接口.
- 包裝的對象中需要獲得到被包裝對象的引用.
- 三種方式:動態代理的方式.
- 被增強的對象實現接口就可以.
【繼承和裝飾者的案例】
- 被增強的對象實現接口就可以.
- 一種方式:繼承的方式.
/** * 繼承的方式增強一個類中某個方法: */ class Man{ public void run(){ System.out.println("跑...."); } } class SuperMan extends Man{ public void run(){ // super.run(); System.out.println("飛...."); } } /** * 使用裝飾者的方式完成類的方法的增強 */ interface Waiter{ public void server(); } class Waiteress implements Waiter{ @Override public void server() { System.out.println("服務..."); } } class WaiteressWrapper implements Waiter{ private Waiter waiter; public WaiteressWrapper(Waiter waiter) { this.waiter = waiter; } @Override public void server() { System.out.println("微笑..."); // this.waiter.server(); } } 【使用裝飾者模式增強Connection的close方法】 public class MyConnection implements Connection{ private Connection conn;
private List<Connection> list;
public MyConnection(Connection conn,List<Connection> list) {
this.conn = conn;
this.list = list;
}
@Override
public void close() throws SQLException {
list.add(conn);
}
...
}
連接池的getConnection方法:@Override
br/>@Override
public Connection getConnection() throws SQLException {
if(list.size() <= 0){
for(int i=1;i<=3;i++){
Connection conn = JDBCUtils.getConnection();
list.add(conn);
}
}
Connection conn = list.remove(0);
MyConnection myConn = new MyConnection(conn, list);
return myConn;
}
【常見的開源的數據庫連接池】:
? DBCP:
DBCP(DataBase connection pool),數據庫連接池。是 apache 上的一個 java 連接池項目,也是 tomcat 使用的連接池組件。單獨使用dbcp需要2個包:commons-dbcp.jar,commons-pool.jar由於建立數據庫連接是一個非常耗時耗資源的行為,所以通過連接池預先同數據庫建立一些連接,放在內存中,應用程序需要建立數據庫連接時直接到連接池中申請一個就行,用完後再放回去。
? C3P0:
C3P0是一個開源的JDBC連接池,它實現了數據源和JNDI綁定,支持JDBC3規範和JDBC2的標準擴展。目前使用它的開源項目有Hibernate,Spring等。
? Tomcat內置連接池:
【DBCP連接池的使用】
第一步:引入DBCP連接池的jar包.
第二步:編寫DBCP代碼:
- 手動設置參數:
- 配置文件設置參數:
【DBCP連接池的使用】
@Test
/**
* 手動方式:
*/
public void demo1(){
Connection conn = null;
PreparedStatement stmt = null;
ResultSet rs = null;
BasicDataSource dataSource = new BasicDataSource();
dataSource.setDriverClassName("com.mysql.jdbc.Driver");
dataSource.setUrl("jdbc:mysql:///web_07");
dataSource.setUsername("root");
dataSource.setPassword("123");
try{
// 獲得連接:
conn = dataSource.getConnection();
// 編寫SQL:
String sql = "select * from category";
// 預編譯SQL:
stmt = conn.prepareStatement(sql);
// 執行SQL:
rs = stmt.executeQuery();
while(rs.next()){
System.out.println(rs.getInt("cid")+" "+rs.getString("cname"));
}
}catch(Exception e){
e.printStackTrace();
}finally{
JDBCUtils.release(rs,stmt, conn);
}
}
@Test
/**
* 配置文件方式:
*/
public void demo2(){
Connection conn = null;
PreparedStatement stmt = null;
ResultSet rs = null;
Properties properties = new Properties();
try{
properties.load(new FileInputStream("src/dbcpconfig.properties"));
DataSource dataSource = BasicDataSourceFactory.createDataSource(properties);
// 獲得連接:
conn = dataSource.getConnection();
// 編寫SQL:
String sql = "select * from category";
// 預編譯SQL:
stmt = conn.prepareStatement(sql);
// 執行SQL:
rs = stmt.executeQuery();
while(rs.next()){
System.out.println(rs.getInt("cid")+" "+rs.getString("cname"));
}
}catch(Exception e){
e.printStackTrace();
}finally{
JDBCUtils.release(rs,stmt, conn);
}
}
JavaWeb07-HTML篇筆記(三)