时间:2021-07-01 10:21:17 帮助过:5人阅读
第26行代码实例化一个DruidDataSource时,我们可以通过Druid框架为我们提供的DruidDataSourceFactory创建出一个DruidDataSource实例,工厂模式给我们提供了大大的便利。
第36行getInstance方法为我们创建出一个数据库连接池实例,这里即用到了单例模式,在这个地方我们可以使用synchronized方法来对getInstance加锁(懒加载)实现线程安全,同时我们也可以使用勤加载来实现线程安全即去掉synchronized关键字,删掉37-39行代码,将第20行代码修改为private static DBPoolConnection dbPoolConnection = new DBPoolConnection()。这两种方式各有其优缺点,懒加载好处就是“用到才实例化”,缺点就是“synchronized关键字对方法加锁的粒度稍稍有点大,采用同步的方式实现线程安全会带来额外的开销”,而勤加载的好处就是“不使用同步的方式实现线程安全,省去了同步机制带来的额外开销”,缺点即是“未用到也会实例化”。至于怎么选择,根据实际情况。这里是之前对单例模式的两篇博文,《单例模式》、《再说单例模式的线程安全问题》。
第55行代码loadPropertiesFile方法是对properties配置文件的加载。
我们在这个类所做的工作差不多就是在spring配置文件中的那一句<bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource">。很简单的一句话,这就是为什么我不想使用Spring框架来配合使用Druid,因为这只会造成只知其一不知其二的结果。
我们接在来实现dao包中的DruidDao类,开始对数据进行持久化操作。由于我们没有用到MyBatis等持久层框架,所以我们不得不使用JDBC来操作数据库,虽然麻烦一点,但这是所有所有框架的基础。
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 }
我们只对数据做插入操作。下面我们测试一下,各个属性的含义可参考: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
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
标签:ati final data iba idle not tab log sql