集合框架類、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");