JDBC數據源(DataSource)的簡單實現


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

本文出自 “熔 岩” 博客,請務必保留此出處http://lavasoft.blog.51cto.com/62575/265073


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM