• JDBC数据源(DataSource)的简单实现


    前言:

        数据源技术是Java操作数据库的一个很关键技术,流行的持久化框架都离不开数据源的应用。

    数据源提供了一种简单获取数据库连接的方式,并能在内部通过一个池的机制来复用数据库连接,这样就大大减少创建数据库连接的次数,提高了系统性能。

    对于数据源的应用,一般都选择实用开源的数据源或数据库连接池来使用,比如,常见的有DBCP、C3P0、Proxool等等。但用起来有些笨重和麻烦。下面自己手动实现个精简的数据源,代码如下:

      1 import org.apache.commons.logging.Log; 
      2 import org.apache.commons.logging.LogFactory; 
      3 
      4 import javax.sql.DataSource; 
      5 import java.util.Collections; 
      6 import java.util.LinkedList; 
      7 import java.sql.Connection; 
      8 import java.sql.SQLException; 
      9 import java.sql.DriverManager; 
     10 import java.io.PrintWriter; 
     11 
     12 /** 
     13 * 一个简单的DataSource实现 
     14 * 
     15 * @author leizhimin 2010-1-14 0:03:17 
     16 */ 
     17 public class SimpleDateSource implements DataSource { 
     18         private static Log log = LogFactory.getLog(SimpleDateSource.class); 
     19         private static final String dirverClassName = "com.mysql.jdbc.Driver"; 
     20         private static final String url = "jdbc:mysql://127.0.0.1:3306/testdb"; 
     21         private static final String user = "root"; 
     22         private static final String pswd = "leizhimin"; 
     23         //连接池 
     24         private static LinkedList<Connection> pool = (LinkedList<Connection>) Collections.synchronizedList(new LinkedList<Connection>()); 
     25         private static SimpleDateSource instance = new SimpleDateSource(); 
     26 
     27         static { 
     28                 try { 
     29                         Class.forName(dirverClassName); 
     30                 } catch (ClassNotFoundException e) { 
     31                         log.error("找不到驱动类!", e); 
     32                 } 
     33         } 
     34 
     35         private SimpleDateSource() { 
     36         } 
     37 
     38         /** 
     39          * 获取数据源单例 
     40          * 
     41          * @return 数据源单例 
     42          */ 
     43         public SimpleDateSource instance() { 
     44                 if (instance == null) instance = new SimpleDateSource(); 
     45                 return instance; 
     46         } 
     47 
     48         /** 
     49          * 获取一个数据库连接 
     50          * 
     51          * @return 一个数据库连接 
     52          * @throws SQLException 
     53          */ 
     54         public Connection getConnection() throws SQLException { 
     55                 synchronized (pool) { 
     56                         if (pool.size() > 0) return pool.removeFirst(); 
     57                         else return makeConnection(); 
     58                 } 
     59         } 
     60 
     61         /** 
     62          * 连接归池 
     63          * 
     64          * @param conn 
     65          */ 
     66         public static void freeConnection(Connection conn) { 
     67                 pool.addLast(conn); 
     68         } 
     69 
     70         private Connection makeConnection() throws SQLException { 
     71                 return DriverManager.getConnection(url, user, pswd); 
     72         } 
     73 
     74         public Connection getConnection(String username, String password) throws SQLException { 
     75                 return DriverManager.getConnection(url, username, password); 
     76         } 
     77 
     78         public PrintWriter getLogWriter() throws SQLException { 
     79                 return null; 
     80         } 
     81 
     82         public void setLogWriter(PrintWriter out) throws SQLException { 
     83 
     84         } 
     85 
     86         public void setLoginTimeout(int seconds) throws SQLException { 
     87 
     88         } 
     89 
     90         public int getLoginTimeout() throws SQLException { 
     91                 return 0; 
     92         } 
     93 
     94         public <T> T unwrap(Class<T> iface) throws SQLException { 
     95                 return null; 
     96         } 
     97 
     98         public boolean isWrapperFor(Class<?> iface) throws SQLException { 
     99                 return false; 
    100         } 
    101 }
  • 相关阅读:
    学习笔记:字符串-Hash
    模板:高精度
    关于我自己
    学习笔记:数学-GCD与LCM-素数筛法
    学习笔记:数学-GCD与LCM-唯一分解定理(质因数分解)
    学习笔记:数学-GCD与LCM-整除的基础概念
    题解 洛谷P1990 覆盖墙壁
    学习笔记:平衡树-splay
    npm发布myself的插件
    javascript API文档
  • 原文地址:https://www.cnblogs.com/ygh1229/p/5807581.html
Copyright © 2020-2023  润新知