1、 使用數據庫連接池優化程序性能
a) 應用程序直接獲取連接的缺點: 用戶每次請求都需要向數據庫獲得鏈接,而數據庫創建連接通常需要消耗相對較大的資源,創建時間也較長
b) 使用連接池中獲取的倆節數據庫通訊
2、 編寫數據庫連接池;
a) 編寫連接池需實現javax.sql.DataSource接口。DataSource接口中定義了兩個重載的getConnection方法:Connection getConnection()、Connection getConnection(String username,String password)
b) 實現DateSource接口,並把創建的連接池加入Linkedlist對象中。
i. 在DateSource構造函數中批量創建與數據庫的連接,並把創建的連接加入LinkedList對象中
ii. 實現getConnection方法,讓get讓getConnection方法每次調用時,從LinkedList中取一個Connection返回給用戶。
iii. 當用戶使用完Connection,調用Connection.close()方法時,Collection對象應保證將自己返回到LinkedList中,而不要把conn還給數據庫。
3、 數據庫連接池核心代碼
a) proxyConn = (Connection) Proxy.newProxyInstance(this.getClass()
.getClassLoader(), conn.getClass().getInterfaces(),
new InvocationHandler() {
//此處爲內部類,當close方法被調用時將conn還回池中,其它方法直接執行
public Object invoke(Object proxy, Method method,
Object[] args) throws Throwable {
if (method.getName().equals("close")) {
pool.addLast(conn);
return null;
}
return method.invoke(conn, args);
}
});
4、 開源數據庫連接池
a) DBCP 數據庫連接池
i. 使用DBCP數據源,應用程序應在系統中增加如下兩個 jar 文件:
1. Commons-dbcp.jar:連接池的實現
2. Commons-pool.jar:連接池實現的依賴庫
ii. DBCP連接池核心代碼
1. static{
a) InputStream in=JdbcUtil.class.getClassLoader();
getResourceAsStream(“dbcpconfig.properties”);
Properties prop=new Properties();
Prop.load(in);
BasicDataSourceFactory factory=new BasicDataSourceFactory();
dataSource=factory.createDateSource(prop);
}
b) C3P0 數據庫連接池
i. 代碼:
1. CombopooleDateSource ds=new CombopooleDateSource();
ds.setDriverClass(“com.mysql.jdbc.Driver”);
ds.setJdbcUrl(“jdbc:mysql://localhost:3306/jdbc1”);
ds.setUser(“root”);
ds.setPassword(“password”);
ds.setMaxPoolSize(40);
ds.setMinPoolSize(10);
ds.setInitialPoolSize(30);
Connection conn=ds.getConnection();
5、 配合Tomcat數據
a) 查看Tomcat文檔;
<Context>
<Resource name="jdbc/datasource" auth="Container"
type="javax.sql.DataSource" username="root" password="root"
driverClassName="com.mysql.jdbc.Driver"
url="jdbc:mysql://localhost:3306/jdbc"
maxActive="8" maxIdle="4"/>
</Context>
Context initCtx = new InitialContext();
Context envCtx = (Context) initCtx.lookup("java:comp/env");
dataSource = (DataSource)envCtx.lookup("jdbc/datasource");
b) 注:此配置下,驅動jar文件要放在tomcat的lib下
6、 JNDI技術簡介
a) JNDI(Java Naming and Directory Interface),Java命名和目錄接口,它對應於J2SE中的javax.naming包,
b) 這套API的主要作用在於:它可以把Java對象放在一個容器中(JNDI容器),併爲容器中的java對象取一個名稱,以後程序想獲得Java對象,只需通過名稱檢索即可。
c) 其核心API爲Context,它代表JNDI容器,其lookup方法爲檢索容器中對應名稱的對象。
d) 代碼:
//初始化jndi容器
Context initCtx=new InitialContext();
//檢索web服務器中的jndi容器
Context envCtx=(Context) initCtx.lookup("java:comp/env");
//從JNDI容器找數據庫連接池
DataSource ds=(DataSource) envCtx.lookup("jdbc/TestDB");