初识数据库连接池开源框架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

平等有多少个jar需求引入,一是druid,二是mysql-connector。

图片 1

我们接在来促成dao包中的DruidDao类,初始对数据进行持久化操作。由于大家从未选拔MyBatis等持久层框架,所以大家不得不选取JDBC来操作数据库,固然麻烦一点,但那是所有所有框架的底蕴。

在上马之前照旧再说说为何不配套使用Spring来行使Druid连接池,原因实在很粗略,在Spring框架的布置文件中唯有一个布置datasource就足以应用Druid了。那毕竟配置这几个datasource数据源时Spring到底对它做了怎么啊?它毕竟是怎么来落实那一个datasource数据源的呢?假使不知其二只知其一,那才真是只是个搬砖的。

第36行getInstance方法为大家创设出一个数据库连接池实例,那里即用到了单例模式,在这几个地方大家得以应用synchronized方法来对getInstance加锁(懒加载)完成线程安全,同时大家也能够运用勤加载来贯彻线程安全即去掉synchronized关键字,删掉37-39行代码,将第20行代码修改为private
static DBPoolConnection dbPoolConnection =
new DBPoolConnection()。那二种格局各有其优缺点,懒加载好处就是“用到才实例化”,缺点就是“synchronized关键字对章程加锁的粒度稍稍有点大,选用一块的点子达成线程安全会带来极度的支出”,而勤加载的益处就是“不利用同步的措施贯彻线程安全,省去了一起机制推动的额外成本”,缺点即是“未用到也会实例化”。至于怎么选取,依照实际情状。这里是后边对单例形式的两篇博文,《单例情势》《再说单例格局的线程安全题材》

 

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

查阅数据库插入成功。

咱俩先是落实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 ylf
16  *
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      * @return
35      */
36     public static synchronized DBPoolConnection getInstance(){
37         if (null == dbPoolConnection){
38             dbPoolConnection = new DBPoolConnection();
39         }
40         return dbPoolConnection;
41     }
42 
43     /**
44      * 返回druid数据库连接
45      * @return
46      * @throws SQLException
47      */
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 }
 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 ylf
15  *
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 }
 1 /**
 2  * 
 3  */
 4 package test;
 5 
 6 import dao.DruidDao;
 7 
 8 /**
 9  * @author ylf
10  *
11  * 2016年10月21日
12  */
13 public class Client {
14 
15     /**
16      * @param args
17      */
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 }

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

driverClassName=com.mysql.jdbc.Driver
url=jdbc:mysql://127.0.0.1:3306/DruidTest
username=root
password=0000
filters=stat
initialSize=2
maxActive=300
maxWait=60000
timeBetweenEvictionRunsMillis=60000
minEvictableIdleTimeMillis=300000
validationQuery=SELECT 1
testWhileIdle=true
testOnBorrow=false
testOnReturn=false
poolPreparedStatements=false
maxPoolPreparedStatementPerConnectionSize=200

Druid是Alibaba的一个数据库连接池开源框架,准确来说它不只囊括数据库连接池这么不难,它还提供强劲的监控和壮大效率。本文仅仅是在不应用Spring框架对Druid的偷窥,选取当下风靡版本druid1.0.26
github地址:https://github.com/alibaba/druid

第26行代码实例化一个DruidDataSource时,我们得以因此Druid框架为我们提供的DruidDataSourceFactory创设出一个DruidDataSource实例,工厂格局给我们提供了大大的便利。

俺们在这几个类所做的劳作大多就是在spring配置文件中的那一句<bean id=”dataSource” class=”com.alibaba.druid.pool.DruidDataSource”>。很简短的一句话,那就是干吗本身不想利用Spring框架来协作使用Druid,因为那只会造成只知其一不知其二的结果。

下边大家专业开班吧,首先照旧一览工程包结构。

图片 2

网站地图xml地图