电竞比分网-中国电竞赛事及体育赛事平台

分享

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

 燮羽 2010-12-02
數據源技術是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)。
功能就很強大了。

    本站是提供個人知識管理的網絡存儲空間,所有內容均由用戶發(fā)布,不代表本站觀點。請注意甄別內容中的聯(lián)系方式、誘導購買等信息,謹防詐騙。如發(fā)現(xiàn)有害或侵權內容,請點擊一鍵舉報。
    轉藏 分享 獻花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多