程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> 關於JAVA >> JDBC數據源(DataSource)的簡單實現

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

編輯:關於JAVA

數據源技術是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

本文配套源碼

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved