1. 程式人生 > >JavaWeb07-HTML篇筆記(三)

JavaWeb07-HTML篇筆記(三)

Java

1.1 案例二:使用連接池改造JDBC的工具類:1.1.1 需求:
傳統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篇筆記(三)