數(shù)據(jù)源技術(shù)是Java操作數(shù)據(jù)庫的一個很關(guān)鍵技術(shù),流行的持久化框架都離不開數(shù)據(jù)源的應(yīng)用。
數(shù)據(jù)源提供了一種簡單獲取數(shù)據(jù)庫連接的方式,并能在內(nèi)部通過一個池的機(jī)制來復(fù)用數(shù)據(jù)庫連接,這樣就大大減少創(chuàng)建數(shù)據(jù)庫連接的次數(shù),提高了系統(tǒng)性能。
對于數(shù)據(jù)源的應(yīng)用,一般都選擇實用開源的數(shù)據(jù)源或數(shù)據(jù)庫連接池來使用,比如,常見的有DBCP、C3P0、Proxool等等。但用起來有些笨重和麻煩。下面自己手動實現(xià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; /** * 一個簡單的DataSource實現(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ū)動類!", e); } } private SimpleDateSource() { } /** * 獲取數(shù)據(jù)源單例 * * @return 數(shù)據(jù)源單例 */ public SimpleDateSource instance() { if (instance == null) instance = new SimpleDateSource(); return instance; } /** * 獲取一個數(shù)據(jù)庫連接 * * @return 一個數(shù)據(jù)庫連接 * @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; } } 這個數(shù)據(jù)源的實現(xiàn)雖然很簡陋,總代碼量不到百行,卻基本上實現(xiàn)了數(shù)據(jù)源的所有功能,達(dá)到了提高Connection復(fù)用的目的。
如果你想做的更復(fù)雜些,做個配置文件,
配置數(shù)據(jù)庫連接信息
寫個后臺線程監(jiān)控連接池的Connection超時、被強(qiáng)制關(guān)閉、池的尺寸、當(dāng)前大小等等。
再完善下數(shù)據(jù)源的log相關(guān)方法的實現(xiàn)。
功能就很強(qiáng)大了。
|
|
來自: 燮羽 > 《數(shù)據(jù)庫》