数据库连接池的使用
连接池基本介绍
- 在使用数据库连接池之前,我们通过程序直接连接数据库或释放数据库资源频繁的连接或释放数据库资源,会消耗大量系统资源效率低下
- 系统运行时,连接池会自动与数据库建立一定数量的连接对象,并将这些连接对象放入连接池中等待使用
- 当程序需要使用连接对象操作数据库时,会在连接池中查找当前未被使用的连接对象;找到后使用该连接对象并将该链接对象的状态设置为繁忙状态,当程序使用结束后关闭与数据库的连接,关闭的是与连接池的连接,并将该对象设置为空闲的状态
- 当连接池中连接对象数目不足时,连接池会自动创建一定数量的连接对象,存放在连接池中等待使用,
连接池中会指定最大连接数量,当到达最大连接数量时将不会再创建新的连接对象 - 程序需要使用连接对象,而连接池中的连接对象没有空闲时,该程序自动进入等待队列中
等待获取连接对象资源,在连接池中会设置一个最大等待时间,如果超时则返回null - 在空闲时会存在大量空闲对象,为了更有效地使用资源,连接池会自动释放一部分空闲的连接对象,让连接对象的数量保持一定的比例
图解
目前市场常见的连接池
- C3P0连接池,DBCP连接池,tomcat自带连接池,Druid连接池
Druid连接池的使用
-
获得开发工具包:在maven中获取,配置到pom.xml文件中
-
创建properties文件:开发一个db.properties文件(配置文件),该文件是一个属性文件,主要用于编写配置,db.properties文件在maven项目中的存放路径为:src/main/resources目录下
-
编写db.properties文件,配置参数可在官网中获取,
相关配置参数:
druid.driverClassName=com.mysql.jdbc.Driver//数据库连接驱动类,可不配置,自动获取 druid.url= //数据库连接url druid.username=root //数据库账户名 druid.password=root //账户密码 druid.initialSize= //连接池初始化连接数量 druid.maxActive= //连接池最大活动连接数量 ,最多有多少个连接可以同时使用 minIdle= //最小空闲连接数量 maxWait= //最大等待时间(以毫秒为单位)
编写配置文件时的注意事项:
- 在properties文件中使用key-value的形式进行相关配置
- 在配置信息时,前缀名可以任意,后缀名固定,不能改变
- 配置参数名注意大小写,每行代码写完不需要分号,不需要双引号,数值赋为0表示无限制
- 数据库连接驱动类,druid可以不设置连接驱动,它可以根据所使用的jar包自动获取驱动类
-
在java程序中获得数据库连接池的连接
大体流程:
- 获得一个属性类对象,
获得db.properties文件的资源流并将其加载到内存中(属性类对象)
通过属性类对象获得一个数据源对象,并通过数据源对象获得与数据库连接池的连接
代码实现:
protected Connection conn = null;//连接属性 protected PreparedStatement ps = null; //预处理对象属性 protected ResultSet rs = null; //结果集对象 protected static DataSource dataSource=null;//dataSource:数据源接口,现如今数据连接产品都实现了此接口 static{ try { /**创建一个属性类对象,该类主要用于操作属性文件 *Properties此类的一个对象表示一个文件,此类的内部基于Map集合 * 生成了一个数据模型,其中无值 * **/ Properties properties=new Properties(); //获得db.properties文件的输入流对象,通过类加载器获得db.properties此文件的资源流,拿到了一个输入流 InputStream input=DBUtil.class.getClassLoader().getResourceAsStream("db.properties"); //将db.properties加载到内存, properties.load(input); //使用properties文件创建一个数据源对象 java程序-->数据源-->数据库 //dataSource可以自动获取输入流对象中的内容 dataSource= DruidDataSourceFactory.createDataSource(properties); } catch (IOException e) { e.printStackTrace(); } catch (Exception e) { e.printStackTrace(); } } protected Connection getConn() throws ClassNotFoundException, SQLException { //使用数据库连接池获取连接 return this.conn=dataSource.getConnection(); }
特点:
-
此段代码在静态代码块中书写
-
有点类似于饿汉模式,在类加载的时候获得db.properties文件的资源流,并将其加载到内存
- 获得一个属性类对象,