1. 程式人生 > >集合框架類、JUNIT單元測試、資料庫連線池

集合框架類、JUNIT單元測試、資料庫連線池

講解知識點:

(1)集合框架類
(2)JUNIT單元測試
(3)資料庫連線池

內容記錄:

(1)集合框架類

任務:向List、Set、Map內放置資料,並輸出。

CollectionTest.java

package cn.sdut.test;
import java.util.*;

public class CollectionTest {
    public static void main(String[] args) {
    /*  List list=new ArrayList();
        list.add("abc");
        list.add("def"
); list.add("fgh"); list.add("abc"); System.out.println(list.size()); for(int i=0;i<list.size();i++) { System.out.println(list.get(i)); } System.out.println(); //long t2=System.currentTimeMillis(); //long t2=System.nanaTime();
for(Object obj:list) { System.out.println(obj); } System.out.println(); Iterator it=list.iterator(); while(it.hasNext()) { Object obj=it.next(); System.out.println(obj); } */ /* Set set=new
HashSet(); set.add("abc"); set.add("def"); set.add("aaa"); set.add("abc"); System.out.println(set.size()); // for(int i=0;i<set.size();i++) // { // System.out.println(set.get(i)); // } // System.out.println(); for(Object obj:set) { System.out.println(obj); } System.out.println(); Iterator it=set.iterator(); while(it.hasNext()) { Object obj=it.next(); System.out.println(obj); }*/ Map map=new HashMap(); map.put("abc", 123); map.put("bcd", 456); map.put("def", 789); map.put("abc", 999); System.out.println(map.size()); System.out.println(map);
        //第一種輸出Map物件
        Set keySet=map.keySet();
        Iterator itKey=keySet.iterator();
        while(itKey.hasNext())
        {
            Object key=itKey.next();
            Object value=map.get(key);
            System.out.println(key+"--"+value);
        }

        //第二種輸出Map物件
        Collection c=map.values();
        for(Object obj:c)
        {
            System.out.println(obj);
        }

        Iterator itValue=c.iterator();
        while(itValue.hasNext())
        {
            System.out.println(itValue.next());
        }
        //第三種方式輸出Map
        Set entrySet=map.entrySet();
        Iterator itEntry=entrySet.iterator();
        while(itEntry.hasNext())
        {
            Map.Entry   entry=(Map.Entry)itEntry.next();****
            Object key=entry.getKey();
            Object value=entry.getValue();
            System.out.println(key+"=="+value);
        }       
    }
}

**Iterator itEntry=map.entrySet().iterator();

**Iterator itKey=map.keySet().iterator();

**Iterator itValue=map.values().iterator();

(2)JUNIT單元測試

步驟:載入JUNIT4類庫;在專案中新建source folder(test),在test源目錄中建立與被測試的類相對應的包,建立測試單元,編寫程式碼,進行測試。

Calculator.java

package cn.sdut.test;

public class Calculator {
   int a;
   int b;
   public Calculator(int a,int b)
   {
       this.a=a;
       this.b=b;
   }
   public int add()
   {
       return a+b;
   }
   public int sub()
   {
       return a-b;
   }
   public int mul()
   {
       return a*b;
   }
   public int div()
   {
       return a/b;
   }
}

CalculatorTest.java

package cn.sdut.test;

import static org.junit.Assert.*;

import org.junit.Test;

public class CalculatorTest {

    @Test
    public void testAdd()
    {
        Calculator cal=new Calculator(10, 2);
        assertEquals( cal.add(),12);
    }



    @Test
    public void testSub()
    {
        Calculator cal=new Calculator(10, 2);
        assertEquals( cal.sub(),8);
    }

    @Test
    public void testMul()
    {
        Calculator cal=new Calculator(10, 2);
        assertEquals( cal.mul(),20);
    }


    @Test(expected=ArithmeticException.class)
    public void testDiv()
    {
        Calculator cal=new Calculator(10,0);
        assertEquals( cal.div(),5);     
    }
}

(3)資料庫連線池

(資料庫連線池:C3P0、DBCP)

1、資料庫連線池技術的優點:

•資源重用:

資料庫連線得以重用——避免頻繁建立“資料庫連線,釋放連線”引起的大量效能開銷。在減少系統消耗的基礎上,另一方面也增加了系統執行環境的平穩性。

•更快的系統反應速度:

資料庫連線池在初始化過程中,已經建立了若干個資料庫連線置於連線池中備用。此時連線的初始化工作均已完成。對於業務請求處理,直接利用現有可用連線,避免了資料庫連線初始化和釋放過程的時間開銷,從而減少了系統的響應時間。

•新的資源分配手段:

對於多應用共享同一資料庫的系統,可在應用層通過資料庫連線池的配置,實現某一應用最大可用資料庫連線數的限制,避免其獨佔所有的資料庫資源。

•統一的連線管理,避免資料庫連線洩露:

在較為完善的資料庫連線池實現中,可根據預先的佔用超時設定,強制回收被佔用連線,從而避免了常規資料庫連線操作中可能出現的資源洩露。

1)兩種開源的資料庫連線池:

• JDBC 的資料庫連線池使用 javax.sql.DataSource 來表示,DataSource 只是一個介面,

該介面通常由伺服器(Weblogic, WebSphere, Tomcat)提供實現,也有一些開源組織提供實現:
–DBCP 資料庫連線池(Apache 軟體基金組織)
–C3P0 資料庫連線池

• DataSource被稱為資料來源,它包含連線池和連線池管理兩個部分,習慣上也經常把 DataSource 稱為連線池。

A:DBCP 資料來源 :

• DBCP 是 Apache 軟體基金組織下的開源連線池實現,該連線池依賴該組織下的另一個開源系統:Common-pool。因此,實現連線池,應在系統中增加如下兩個 jar 檔案:

–commons-dbcp.jar:連線池的實現。
–commons-pool.jar:連線池實現的依賴庫。

• Tomcat 的連線池正是採用該連線池來實現的。該資料庫連線池既可以與應用伺服器整合使用,也可由應用程式獨立使用。

DBCP 資料來源使用範例:

• 資料來源和資料庫連線不同——資料來源無需建立多個,它是產生資料庫連線的工廠,因此整個應用只需要一個數據源即可。

• 當資料庫訪問結束後,程式還是像以前一樣關閉資料庫連線:conn.close(); 但它並沒有關閉資料庫的物理連線,僅僅把資料庫連線釋放,歸還給了資料庫連線池。

dbcp.properties
username=root
password=usbw
driverClassName=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/school

initialSize=10
maxActive=50
minIdle=5
maxWait=5000

DBCPUtils.java

package cn.sdut.util;
import java.io.IOException;
import java.sql.Connection;
import java.sql.SQLException;
import java.util.Properties;
import javax.sql.DataSource;
import org.apache.commons.dbcp.BasicDataSource;
import org.apache.commons.dbcp.BasicDataSourceFactory;
public class DBCPUtils {
    static DataSource datasource;

    public static Connection getConn(){
        Connection con=null;
        Properties props=new Properties();
        try {
            props.load(DBCPUtils.class.getResourceAsStream("/dbcp.properties"));
            datasource=BasicDataSourceFactory.createDataSource(props);
            con= datasource.getConnection();

        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        return con;
    }

    public static Connection getConn2(){
        Connection con=null;
        BasicDataSource datasource=new BasicDataSource();
        datasource.setUsername("root");
        datasource.setPassword("usbw");
        datasource.setUrl("jdbc:mysql://localhost:3306/school");
        datasource.setDriverClassName("com.mysql.jdbc.Driver");
        datasource.setInitialSize(5);
        datasource.setMaxActive(20);
        datasource.setMinIdle(3);
        datasource.setMaxWait(5000);
        try {
            con=datasource.getConnection();
        } catch (SQLException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        return con;
    }
public static void main(String[] args) {
    Connection con1=getConn();
    System.out.println(con1);
    Connection con2=getConn2();
    System.out.println(con2);
}
}
B:C3P0 資料來源
c3p0.properties
c3p0.user=root
c3p0.password=usbw
c3p0.driverClass=com.mysql.jdbc.Driver
c3p0.jdbcUrl=jdbc\:mysql\://localhost\:3306/school

C3P0Utils.java

package cn.sdut.util;

import java.beans.PropertyVetoException;
import java.sql.Connection;
import java.sql.SQLException;

import com.mchange.v2.c3p0.ComboPooledDataSource;

public class C3P0Utils {
    public static Connection getConn1() {
        Connection con = null;
        ComboPooledDataSource ds = new ComboPooledDataSource();
        try {
            con = ds.getConnection();
        } catch (SQLException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        return con;
    }

    public static Connection getConn2() {
        Connection con = null;
        ComboPooledDataSource ds = new ComboPooledDataSource();
        try {
            ds.setUser("root");
            ds.setPassword("usbw");
            ds.setDriverClass("com.mysql.jdbc.Driver");
            ds.setJdbcUrl("jdbc:mysql://localhost:3306/school");
            ;
            con = ds.getConnection();
        } catch (PropertyVetoException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (SQLException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

        return con;
    }

    public static void main(String[] args) {
        System.out.println(getConn1());
        System.out.println(getConn2());
    }
}

C3p0原始碼探索(一)之配置篇

所需檔案:
1、 c3p0-0.9.1.2.jar http://sourceforge.net/projects/c3p0/
2、 mysql.jar http://dev.mysql.com/downloads/connector/j/5.0.html
3、 c3p0-0.9.1.2http://nchc.dl.sourceforge.net/sourceforge/c3p0/c3p0-0.9.1.2.src.zip(可選)
擁有以上三樣東西就可以開始c3p0之旅了,把mysql.jar和c3p0-0.9.1.2.jar放到classpath中就可以開始編寫我們的程式碼了。

C3p0最簡單的使用方式就如其官網下所說的一樣,只需提供driverName,url,user,password,程式就可以跑起來。

第一種獲取資料來源的方式:

Java程式碼

ComboPooledDataSource cpds = new ComboPooledDataSource();  
      String driverClass = "com.mysql.jdbc.Driver";  
      String jdbcURL = "jdbc:mysql://localhost:3306/test";  
      String user = "root";  
      String password = "";  
      cpds.setDriverClass(driverClass);  
      cpds.setJdbcUrl(jdbcURL);  
      cpds.setUser(user);  
      cpds.setPassword(password);  
      cpds.setMaxStatements(100);  
      Connection conn = cpds.getConnection();  

正如簡單的jdbc連線資料庫一樣僅僅只需要這些引數而已。

對於這種配置,如果classpath中有c3p0.properties的配置檔案,程式碼中不需要設定連線資訊,直接new ComboPooledDataSource(),它會自動讀取配置檔案中的配置。當然也可以使用c3p0-config.xml檔案配置連線資訊,使用xml作為配置資訊的話,comboPoolDataSource還可以接受一個String引數,這個引數的名稱是在c3p0-config.xml檔案中配置,這就意味著我們可以在xml檔案中可有都多個數據庫源連線資訊,比如可以是mysql,oracle的。

Java程式碼

ComboPooledDataSource cpds = new ComboPooledDataSource(“test”);  
<named-config name="test">  
   <property name="maxStatements">200</property> 
   <propertyname="jdbcUrl">jdbc:mysql://localhost:3306/test</property>  
   <property name="user">root</property>  
   <property name="password"></property>  
</named-config>  

使用配置檔案的方式連線時,c3p0預設在classpath根目錄讀取配置檔案,如果想把配置檔案放在自己想放的地方只需設定系統屬性。

Java程式碼

System.setProperties(“com.mchange.v2.c3p0.cfg.xml”,”config/c3p0-config.xml”);  

程式就在指定的目錄下讀取該配置檔案。

第二種方式獲取資料來源,使用資料來源工廠類DataSources

Java程式碼

DataSource ds = DataSources.unpooledDataSource(jdbcURL, user, password);  
DataSource pooledDateSource = DataSources.pooledDataSource(ds);  
      System.out.println(pooledDateSource.getConnection());  

第三種獲取資料來源的方式:

Java程式碼

PoolBackedDataSource backedDataSource = new PoolBackedDataSource();  
backedDataSource.setConnectionPoolDataSource(new ConnectionPoolDataSource() );  
//實現自己的connectionpooldatasource即可  

引數配置:
除了以上連線資料庫必要的引數外,提供以下最基本的引數配置資訊才能形成資料庫連線池
1、 acquireIncrement 每次連線增加數量
2、 initalPoolSize 初始連線數
3、 maxPoolSize 最大連線數
4、 maxIdleTime 最大空閒數
5、 minPoolSize 池中連線最小數量

Tomcat中配置c3p0的方法:

1、server.xml中配置

Xml程式碼

<GlobalNamingResources>  
<!-- Editable user database that can also be used by  
        UserDatabaseRealm to authenticate users  
   -->  
   <Resource  name="jdbc/test"  
               auth="Container"  
               description="User database that can be updated and saved"  
                factory="org.apache.naming.factory.BeanFactory"  
               driverClass="com.mysql.jdbc.Driver"  
               maxPoolSize="4"  
               minPoolSize="2"  
               acquireIncrement="1"  
              user="root"  
              password=""  
           type="com.mchange.v2.c3p0.ComboPooledDataSource"  
          jdbcUrl="jdbc:mysql://localhost:3306/test" />  
  </GlobalNamingResources>  

2、 conf目錄下Context.xml

 <ResourceLink name="jdbc/test" global="jdbc/test" type="javax.sql.DataSource"/>

3、 web.xml

Xml程式碼

<resource-ref>  
<res-ref-name>jdbc/ test</res-ref-name>  
<res-type>javax.sql.DataSource</res-type>  
    <res-auth>Container</res-auth>  
</resource-ref>  

測試:

Java程式碼

InitialContext context = new InitialContext();  
return (DataSource) context.lookup("java:comp/env/jdbc/test");