数据源和连接池

在学习数据源连接池之前我们先来了解一个一种模式。
DAO模式:(使我们在编程时经常用到的一种编程模式)数据访问对象,它是标准的JavaEE设计模式的一种。
使用DAO模式可以把底层的数据访问操作和上层的业务逻辑分开。
一个DAO模式我们用三个组件来实现:
1、DAO接口
2、DAO接口的具体实现类
3、DAO工厂类

对于在JDBC的应用中DAO接口主要是用于声明我要实现的CURD操作:
我在这里做了一个Employee实例针对其进行增删查改,基于MySQL数据库
1、实现DAO接口,声明我要实现的方法:

package dao;

import entity.Employee;
import entity.Page;

import java.util.List;

public interface EmpDao {
//插入
void save(Employee emp);
//修改
void update(Employee emp);
//删除
void delete(int id);
//根据条件查询某一条
Employee findone(int id);
//查询所有记录
List<Employee> findAll();
//模糊查询
List<Employee> findByName(String name);
//统计总记录数
long count();
//分页查询
Page<Employee> findAll(int number,int size);
}

有了接口我们接下来就需要DAO实现类来实现我们具体的操作:

public class EmpDaoMySQLImpl implements EmpDao {

//这里质检单罗列了增删查改的功能
private static DataSource ds=DBUtils.getDateSource();
@Override
public void save(Employee emp) {
    QueryRunner qr=new QueryRunner(ds);
    String sql="INSERT INTO employee(name,joinTime,gender,job,salary) VALUES(?,?,?,?,?)";
    try {
        qr.update(sql,emp.getName(),emp.getJoinTime(),emp.getGender(),emp.getJob(),emp.getSalary());
    } catch (SQLException e) {
        e.printStackTrace();
    }


}

@Override
public void update(Employee emp) {
    Connection conn=null;
    conn=DBUtils.getConnection();

    QueryRunner qr=new QueryRunner();
    String sql="UPDATE employee SET name=?,joinTime=?,gender=?,job=?,salary=? WHERE id=?";
    try {
        qr.update(conn,sql,emp.getName(),emp.getJoinTime(),emp.getGender(),emp.getJob(),emp.getSalary(), emp.getId());
    } catch (SQLException e) {
        e.printStackTrace();
    }finally {
        DBUtils.close(conn);
    }
}

@Override
public void delete(int id) {
    Connection conn=null;
    conn=DBUtils.getConnection();

    QueryRunner qr=new QueryRunner();
    String sql="DELETE FROM employee WHERE id=?";
    try {
        qr.update(conn,sql,id);
    } catch (SQLException e) {
        e.printStackTrace();
    }finally {
        DBUtils.close(conn);
    }
}

@Override
public Employee findone(int id) {
    Connection conn=null;
    Employee ee=null;
    conn=DBUtils.getConnection();
    QueryRunner qr=new QueryRunner();
    String sql="SELECT id,name,joinTime,gender,job,salary From employee WHERE id="+id;
    try {
        //BeanHandler将结果集的第一行数据,封装成JavaBean对象
        ee=qr.query(conn,sql,new BeanHandler<Employee>(Employee.class));
    } catch (SQLException e) {
        e.printStackTrace();
    }finally {
        DBUtils.close(conn);
    }
    return ee;
  }
}

最后一步就是通过DAO工厂类来产生具体的DAO实现类实例,以为针对不同的数据库我们可能会有不同的增删查改及其他功能操作,为了后期的修改方便,我们把要实现的类放在一个properties文件里面,通过Properties来加载具体的实现类即可。

public class DaoFactory {
  //dao工厂

private static Properties prop=new Properties();
static {
    try {
        prop.load(Thread.currentThread().getContextClassLoader().getResourceAsStream("config.properties"));
    } catch (IOException e) {
        e.printStackTrace();
    }
}

//获取实例
public static Object getInstance(String key){
    String name=prop.getProperty(key);
    Object obj=null;
    try {
        obj=Class.forName(name).newInstance();
    } catch (InstantiationException e) {
        e.printStackTrace();
    } catch (IllegalAccessException e) {
        e.printStackTrace();
    } catch (ClassNotFoundException e) {
        e.printStackTrace();
    }
    return obj;
  }
}

就这样我们的DAO模式就已经实现,这样在我们执行的时候

  public class TestDruid {
  public static void main(String[] args) {
    //我们直接通过工厂类来来获取具体实现类来执行操作
    EmpDao ed= (EmpDao) DaoFactory.getInstance("Empdao");
    //新增数据
    ed.save(new Employee(1,"嘿嘿",new Date(),"男","就是玩",2300));
}

那么接下来是要说说我们的数据源连接池的问题了,这个问题的缘由是由于当我们的项目有很大的访问量是,每个用户的访问都需要新建连接进行连接,我们的连接时间是最为耗时的,为了防止同时多个客户同时操作数据库,我们就准备了一个连接池,把我们的连接提前创建直接放在我们的池子里,当用的时候直接获取使用就会大大提高我们的效率。

数据源:数据源,作为DriverManager工具类的 替代项,是用亍获取数据库连接的首选方式。 其设置了我们确定数据的基本配置参数以及驱动。

#mysql config
driverClass=com.mysql.cj.jdbc.Driver
url=jdbc:mysql://localhost:3306/mytest?serverTimezone=UTC
username=root
password=root
#druid配置初始化大小、最小、最大
druid.initialSize=1
druid.minIdle=1
druid.maxActive=20
#配置获取连接等待超时的时间
druid.maxWait=60000
#配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒
druid.timeBetweenEvictionRunsMillis=60000
# 配置一个连接在池中最小生存的时间,单位是毫秒
druid.minEvictableIdleTimeMillis=300000
druid.validationQuery=SELECT 'x’ druid.testWhileIdle=true
druid.testOnBorrow=false
druid.testOnReturn=false
#配置监控统计拦截的filters
druid.filters=stat
maxOpenPreparedStatements=20
removeAbandoned=true
removeAbandonedTimeout=1800
logAbandoned=true

然后我们引用了Alibaba的druid.jar包,其效率是目前最快的。

public class DBUtils {
//通过druid数据库连接池来获取连接

private static Properties prop = new Properties();
private static DataSource ds = null;

static {
    try {
        prop.load(Thread.currentThread().getContextClassLoader().getResourceAsStream("druid.properties"));
        ds = DruidDataSourceFactory.createDataSource(prop);
    } catch (IOException e) {
        System.out.println("未找到配置文件");
        e.printStackTrace();
    } catch (Exception e) {
        e.printStackTrace();
    }
  }
 //需要从连接池获取 通过DataSource
public static Connection getConnection(){
    Connection conn=null;
    try {
        conn=ds.getConnection();
    } catch (SQLException e) {
        e.printStackTrace();
    }

    return conn;
}

public static DataSource getDateSource(){
    return ds;
}
}

这样基本的原理及使用流程就实现了。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,406评论 6 503
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,732评论 3 393
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 163,711评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,380评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,432评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,301评论 1 301
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,145评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,008评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,443评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,649评论 3 334
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,795评论 1 347
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,501评论 5 345
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,119评论 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,731评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,865评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,899评论 2 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,724评论 2 354

推荐阅读更多精彩内容