初识数据库连接池开源框架Druid
admin
2023-05-24 03:02:41
0

Druid是阿里巴巴的一个数据库连接池开源框架,准确来说它不仅仅包括数据库连接池这么简单,它还提供强大的监控和扩展功能。本文仅仅是在不采用Spring框架对Druid的窥探,采用目前最新版本druid1.0.26 github地址:https://github.com/alibaba/druid。

在开始之前还是再说说为什么不配套使用Spring来使用Druid连接池,原因其实很简单,在Spring框架的配置文件中仅仅一个配置datasource就可以使用Druid了。那到底配置这个datasource数据源时Spring到底对它做了什么呢?它到底是怎么来实现这个datasource数据源的呢?如果不知其二只知其一,那才真是只是个搬砖的。

下面我们正式开始吧,首先还是一览工程包结构。

初识数据库连接池开源框架Druid

同样有两个jar需要引入,一是druid,二是mysql-connector。

初识数据库连接池开源框架Druid

我们首先实现util包里的DBPoolConnection类,这个类用来创建数据库连接池单例以及返回一个数据库连接。为什么数据库连接池需要单例呢?原因其实很简单,我们可以想象在一个web应用中,同时可能会存在多个请求如果为每一个请求都创建一个数据库连接池,那还有什么意义呢?应该是不论有多少个并发请求,都应该只存在一个数据库连接池,在这个数据库连接池中为每个请求创建一个数据库连接。

初识数据库连接池开源框架Druid

 1 package util; 2  3 import java.io.File; 4 import java.io.FileInputStream; 5 import java.io.InputStream; 6 import java.sql.SQLException; 7 import java.util.Properties; 8  9 import com.alibaba.druid.pool.DruidDataSource;10 import com.alibaba.druid.pool.DruidDataSourceFactory;11 import com.alibaba.druid.pool.DruidPooledConnection;12 13 /**14  * 要实现单例模式,保证全局只有一个数据库连接池15  * @author ylf16  *17  * 2016年10月21日18  */19 public class DBPoolConnection {20     private static DBPoolConnection dbPoolConnection = null;21     private static DruidDataSource druidDataSource = null;22     23     static {24         Properties properties = loadPropertiesFile("db_server.properties");25         try {26             druidDataSource = (DruidDataSource)DruidDataSourceFactory.createDataSource(properties);    //DruidDataSrouce工厂模式27         } catch (Exception e) {28             e.printStackTrace();29         }30     }31     32     /**33      * 数据库连接池单例34      * @return35      */36     public static synchronized DBPoolConnection getInstance(){37         if (null == dbPoolConnection){38             dbPoolConnection = new DBPoolConnection();39         }40         return dbPoolConnection;41     }42 43     /**44      * 返回druid数据库连接45      * @return46      * @throws SQLException47      */48     public DruidPooledConnection getConnection() throws SQLException{49         return druidDataSource.getConnection();50     }51     /**52      * @param string 配置文件名53      * @return Properties对象54      */55     private static Properties loadPropertiesFile(String fullFile) {56         String webRootPath = null;57         if (null == fullFile || fullFile.equals("")){58             throw new IllegalArgumentException("Properties file path can not be null" + fullFile);59         }60         webRootPath = DBPoolConnection.class.getClassLoader().getResource("").getPath();61         webRootPath = new File(webRootPath).getParent();62         InputStream inputStream = null;63         Properties p =null;64         try {65             inputStream = new FileInputStream(new File(webRootPath + File.separator + fullFile));66             p = new Properties();67             p.load(inputStream);68         } catch (Exception e) {69             e.printStackTrace();70         } finally {71             try {72                 if (null != inputStream){73                     inputStream.close();74                 }75             } catch (Exception e) {76                 e.printStackTrace();77             }78         }79         80         return p;81     }82     83 }

初识数据库连接池开源框架Druid

第26行代码实例化一个DruidDataSource时,我们可以通过Druid框架为我们提供的DruidDataSourceFactory创建出一个DruidDataSource实例,工厂模式给我们提供了大大的便利。

第36行getInstance方法为我们创建出一个数据库连接池实例,这里即用到了单例模式,在这个地方我们可以使用synchronized方法来对getInstance加锁(懒加载)实现线程安全,同时我们也可以使用勤加载来实现线程安全即去掉synchronized关键字,删掉37-39行代码,将第20行代码修改为private static DBPoolConnection dbPoolConnection = new DBPoolConnection()。这两种方式各有其优缺点,懒加载好处就是“用到才实例化”,缺点就是“synchronized关键字对方法加锁的粒度稍稍有点大,采用同步的方式实现线程安全会带来额外的开销”,而勤加载的好处就是“不使用同步的方式实现线程安全,省去了同步机制带来的额外开销”,缺点即是“未用到也会实例化”。至于怎么选择,根据实际情况。这里是之前对单例模式的两篇博文,《单例模式》、《再说单例模式的线程安全问题》。

第55行代码loadPropertiesFile方法是对properties配置文件的加载。

我们在这个类所做的工作差不多就是在spring配置文件中的那一句。很简单的一句话,这就是为什么我不想使用Spring框架来配合使用Druid,因为这只会造成只知其一不知其二的结果。

我们接在来实现dao包中的DruidDao类,开始对数据进行持久化操作。由于我们没有用到MyBatis等持久层框架,所以我们不得不使用JDBC来操作数据库,虽然麻烦一点,但这是所有所有框架的基础。

初识数据库连接池开源框架Druid

 1 /** 2  * 
 3  */ 4 package dao; 5  6 import java.sql.PreparedStatement; 7 import java.sql.SQLException; 8  9 import com.alibaba.druid.pool.DruidPooledConnection;10 11 import util.DBPoolConnection;12 13 /**14  * @author ylf15  *16  * 2016年10月21日17  */18 public class DruidDao {19     20     public void insert(String sql){21         DBPoolConnection dbp = DBPoolConnection.getInstance();    //获取数据连接池单例22         DruidPooledConnection conn = null;23         PreparedStatement ps = null;24         try {25             conn = dbp.getConnection();    //从数据库连接池中获取数据库连接26             ps = conn.prepareStatement(sql);27             ps.executeUpdate();28         } catch (SQLException e) {29             e.printStackTrace();30         } finally {31             try {32                 if (null != ps){33                     ps.close();34                 }35                 if (null != conn){36                     conn.close();37                 }38             } catch (Exception e) {39                 e.printStackTrace();40             }41         }42     }43 }

初识数据库连接池开源框架Druid

我们只对数据做插入操作。下面我们测试一下,各个属性的含义可参考:https://github.com/alibaba/druid/wiki/DruidDataSource%E9%85%8D%E7%BD%AE%E5%B1%9E%E6%80%A7%E5%88%97%E8%A1%A8

初识数据库连接池开源框架Druid

 1 /** 2  * 
 3  */ 4 package test; 5  6 import dao.DruidDao; 7  8 /** 9  * @author ylf10  *11  * 2016年10月21日12  */13 public class Client {14 15     /**16      * @param args17      */18     public static void main(String[] args) {19         DruidDao druidDao = new DruidDao();20         String sql = "insert into test (name) values(\"keven\")";21         druidDao.insert(sql);22     }23 24 }

初识数据库连接池开源框架Druid

查看数据库插入成功。

另外db_server.properties数据库的配置文件如下:

初识数据库连接池开源框架Druid

driverClassName=com.mysql.jdbc.Driver
url=jdbc:mysql://127.0.0.1:3306/DruidTestusername=root
password=0000filters=stat
initialSize=2maxActive=300maxWait=60000timeBetweenEvictionRunsMillis=60000minEvictableIdleTimeMillis=300000validationQuery=SELECT 1testWhileIdle=truetestOnBorrow=falsetestOnReturn=falsepoolPreparedStatements=falsemaxPoolPreparedStatementPerConnectionSize=200

初识数据库连接池开源框架Druid


相关内容

热门资讯

“宜兰女婿”蒋万安跨县市力挺,... 海峡导报综合报道 国民党宜兰县长参选人吴宗宪19日晚办首场大型造势,数千名支持者力挺。身为“宜兰女婿...
重返欧盟?“英国须付数十亿英镑... 【文/观察者网 熊超然】近期,英国政局动荡不稳,“逆转脱欧”已成为执政党工党领导层内部那场充满戏剧性...
修水龙头出水小怎么办 水龙头出水小可能有多种原因,以下是一些常见的解决方法:1. 检查水龙头滤网:拧下水龙头前端的滤网,清...
冷热水龙头只出冷水不出热水怎么... 冷热水龙头只出冷水不出热水,可能是由以下原因导致的:1. 热水供应问题:检查热水器是否正常工作,是否...
厨房水龙头冷热水龙头漏水怎么办 1、出现漏水的情况,多半是阀芯坏掉了,只要更换里面的阀芯。首先需要去五金店里面购买一个相同型号的阀芯...
凤凰晚报丨70岁榜一阿姨:掏空... 今日人物【70岁榜一阿姨:掏空儿子336万积蓄,守护男主播】70岁上海阿姨江慧英,精打细算了大半辈子...
水龙头堵塞怎么疏通 1、逆时针拧下水龙头的滤嘴,如果拧不动,垫一块布用钳子拧。2、滤嘴口向下,用拇指用力向上顶,将塑料滤...
方太燃气灶新的打不着火 主要原因有,1、脉冲点火器没有电池,电池没有电,或者是电池接触不良。2、点火针有污垢或者是点火针的位...
霍尔木兹海峡危机给叙利亚带来机... 澎湃新闻记者 南博一自2月28日美以伊战争爆发以来,霍尔木兹海峡的航运已中断近80天。然而,这却为正...
刚川金属取得紧固垫圈成型模具专... 国家知识产权局信息显示,重庆市刚川金属制品有限公司取得一项名为“一种紧固垫圈成型模具”的专利,授权公...