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