數(shù)據(jù)源技術(shù)是Java操作數(shù)據(jù)庫(kù)的一個(gè)很關(guān)鍵技術(shù),流行的持久化框架都離不開數(shù)據(jù)源的應(yīng)用。
數(shù)據(jù)源提供了一種簡(jiǎn)單獲取數(shù)據(jù)庫(kù)連接的方式,并能在內(nèi)部通過(guò)一個(gè)池的機(jī)制來(lái)復(fù)用數(shù)據(jù)庫(kù)連接,這樣就大大減少創(chuàng)建數(shù)據(jù)庫(kù)連接的次數(shù),提高了系統(tǒng)性能。
對(duì)于數(shù)據(jù)源的應(yīng)用,一般都選擇實(shí)用開源的數(shù)據(jù)源或數(shù)據(jù)庫(kù)連接池來(lái)使用,比如,常見的有DBCP、C3P0、Proxool等等。但用起來(lái)有些笨重和麻煩。下面自己手動(dòng)實(shí)現(xiàn)個(gè)精簡(jiǎn)的數(shù)據(jù)源,代碼如下:
package com.lavasoft.simpledatesource; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import javax.sql.DataSource; import java.util.Collections; import java.util.LinkedList; import java.sql.Connection; import java.sql.SQLException; import java.sql.DriverManager; import java.io.PrintWriter; /** * 一個(gè)簡(jiǎn)單的DataSource實(shí)現(xiàn) * * @author leizhimin 2010-1-14 0:03:17 */ public class SimpleDateSource implements DataSource { private static Log log = LogFactory.getLog(SimpleDateSource.class); private static final String dirverClassName = "com.mysql.jdbc.Driver"; private static final String url = "jdbc:mysql://127.0.0.1:3306/testdb"; private static final String user = "root"; private static final String pswd = "leizhimin"; //連接池 private static LinkedList<Connection> pool = (LinkedList<Connection>) Collections.synchronizedList(new LinkedList<Connection>()); private static SimpleDateSource instance = new SimpleDateSource(); static { try { Class.forName(dirverClassName); } catch (ClassNotFoundException e) { log.error("找不到驅(qū)動(dòng)類!", e); } } private SimpleDateSource() { } /** * 獲取數(shù)據(jù)源單例 * * @return 數(shù)據(jù)源單例 */ public SimpleDateSource instance() { if (instance == null) instance = new SimpleDateSource(); return instance; } /** * 獲取一個(gè)數(shù)據(jù)庫(kù)連接 * * @return 一個(gè)數(shù)據(jù)庫(kù)連接 * @throws SQLException */ public Connection getConnection() throws SQLException { synchronized (pool) { if (pool.size() > 0) return pool.removeFirst(); else return makeConnection(); } } /** * 連接歸池 * * @param conn */ public static void freeConnection(Connection conn) { pool.addLast(conn); } private Connection makeConnection() throws SQLException { return DriverManager.getConnection(url, user, pswd); } public Connection getConnection(String username, String password) throws SQLException { return DriverManager.getConnection(url, username, password); } public PrintWriter getLogWriter() throws SQLException { return null; } public void setLogWriter(PrintWriter out) throws SQLException { } public void setLoginTimeout(int seconds) throws SQLException { } public int getLoginTimeout() throws SQLException { return 0; } public <T> T unwrap(Class<T> iface) throws SQLException { return null; } public boolean isWrapperFor(Class<?> iface) throws SQLException { return false; } } 這個(gè)數(shù)據(jù)源的實(shí)現(xiàn)雖然很簡(jiǎn)陋,總代碼量不到百行,卻基本上實(shí)現(xiàn)了數(shù)據(jù)源的所有功能,達(dá)到了提高Connection復(fù)用的目的。
如果你想做的更復(fù)雜些,做個(gè)配置文件,
配置數(shù)據(jù)庫(kù)連接信息
寫個(gè)后臺(tái)線程監(jiān)控連接池的Connection超時(shí)、被強(qiáng)制關(guān)閉、池的尺寸、當(dāng)前大小等等。
再完善下數(shù)據(jù)源的log相關(guān)方法的實(shí)現(xiàn)。
功能就很強(qiáng)大了。
|
|
來(lái)自: 燮羽 > 《數(shù)據(jù)庫(kù)》