Druid是阿里巴巴的一个数据库连接池开源框架,准确来说它不仅仅包括数据库连接池这么简单,它还提供强大的监控和扩展功能。本文仅仅是在不采用Spring框架对Druid的窥探,采用目前最新版本druid1.0.26 github地址:https://github.com/alibaba/druid。
在开始之前还是再说说为什么不配套使用Spring来使用Druid连接池,原因其实很简单,在Spring框架的配置文件中仅仅一个配置datasource就可以使用Druid了。那到底配置这个datasource数据源时Spring到底对它做了什么呢?它到底是怎么来实现这个datasource数据源的呢?如果不知其二只知其一,那才真是只是个搬砖的。
下面我们正式开始吧,首先还是一览工程包结构。
同样有两个jar需要引入,一是druid,二是mysql-connector。
我们首先实现util包里的DBPoolConnection类,这个类用来创建数据库连接池单例以及返回一个数据库连接。为什么数据库连接池需要单例呢?原因其实很简单,我们可以想象在一个web应用中,同时可能会存在多个请求如果为每一个请求都创建一个数据库连接池,那还有什么意义呢?应该是不论有多少个并发请求,都应该只存在一个数据库连接池,在这个数据库连接池中为每个请求创建一个数据库连接。
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 }初识数据库连接池开源框架德鲁伊