数据库连接池
数据库连接---执行完毕---释放
连接---释放十分浪费资源
池化技术:准备一些预先的资源,过来就连接预准备好 的
最小连接数:10
最大连接数:15
如果超过最大连接数,那就等待
编写一个连接池,实现一个接口 DataSource
开源数据源实现
使用了这些数据库连接池之后,我们在项目中就不需要编写连接数据库的代码了
一、连接池DBCP
DBCP(DataBase connection pool),数据库连接池。是 apache 上的一个 java 连接池项目,也是 tomcat 使用的连接池组件。单独使用dbcp需要3个包:common-dbcp.jar,common-pool.jar,common-collections.jar由于建立数据库连接是一个非常耗时耗资源的行为,所以通过连接池预先同数据库建立一些连接,放在内存中,应用程序需要建立数据库连接时直接到连接池中申请一个就行,用完后再放回去。
-
导入两个jar包commons-dbcp-1.4.jar和commons-pool-1.6.jar导入lib目录下
-
在src下new一个File文件------创建dbcpconfig.properties文件
driverClassName=com.mysql.jdbc.Driver url=jdbc:mysql://localhost:3306/jdbcStudy?useUnicode=true&characterEncoding=utf8&useSSL=true username=root password=123456 initialSize=10 maxActive=50 maxIdle=20 minIdle=5 maxWait=60000 connectionProperties=useUnicode=true;characterEncoding=utf8 defaultAutoCommit=true defaultReadOnly= defaultTransactionIsolation=REPEATABLE_READ
-
代码实现
-
创建一个utils工具类
package com.lyh.lesson05.utils; import org.apache.commons.dbcp.BasicDataSource; import org.apache.commons.dbcp.BasicDataSourceFactory; import javax.sql.DataSource; import java.io.InputStream; import java.sql.*; import java.util.Properties; public class JdbcUtils_DBCP { private static DataSource dataSource=null; static { try { /** * getClassLoader()获得一个加载器 * getResourceAsStream()拿到他的资源 * 返回一个输入流InputStream */ InputStream inputStream = JdbcUtils_DBCP.class.getClassLoader().getResourceAsStream("dbcpconfig.properties"); Properties properties = new Properties(); properties.load(inputStream); //创建数据源BasicDataSource //创建数据源工厂BasicDataSourceFactory---->工厂模式创建BasicDataSourceFactory.createDataSource(properties); //properties把这个对象流导入进去加工 dataSource = BasicDataSourceFactory.createDataSource(properties); } catch (Exception e) { e.printStackTrace(); } } //获取链接 public static Connection getConnection() throws SQLException { return dataSource.getConnection();//从数据源获取连接 } //释放资源 public static void close(Connection connection, Statement statement, ResultSet resultSet) throws SQLException { if (resultSet!=null){ resultSet.close(); } if (statement!=null){ statement.close(); } if (connection!=null){ connection.close(); } } }
-
测试DBCP
package com.lyh.lesson05; import com.lyh.lesson05.utils.JdbcUtils_DBCP; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; public class TestDBCP { public static void main(String[] args) { Connection conn=null; PreparedStatement ps=null; ResultSet rs=null; try { conn=JdbcUtils_DBCP.getConnection(); String sql="select * from users where id=1;"; ps=conn.prepareStatement(sql); rs=ps.executeQuery(); while (rs.next()){ System.out.println(rs.getInt("id")); System.out.println(rs.getString("name")); System.out.println(rs.getString("password")); System.out.println(rs.getString("email")); System.out.println(rs.getDate("birthday")); } JdbcUtils_DBCP.close(conn,ps,rs); } catch (SQLException e) { e.printStackTrace(); } } }
-
二、连接池C3P0
C3P0是一个开源的JDBC连接池,它实现了数据源和JNDI绑定,支持JDBC3规范和JDBC2的标准扩展。目前使用它的开源项目有Hibernate,Spring等。
-
导入两个jar包c3p0-0.9.5.5.jar和mchange-commons-java-0.2.19.jar导入lib目录下
-
在src下new一个File文件------创建c3p0-config.xml文件
<?xml version="1.0" encoding="UTF-8"?> <c3p0-config> <default-config> <property name="driverClass">com.mysql.jdbc.Driver</property> <property name="jdbcUrl">jdbc:mysql://localhost:3306/jdbcstudy</property> <property name="user">root</property> <property name="password">123456</property> <property name="initialPoolSize">10</property> <property name="maxIdleTime">30</property> <property name="maxPoolSize">100</property> <property name="minPoolSize">10</property> </default-config> <!-- new ComboPooledDataSource("MySQL"); 锁定这个里面的MySQL--> <named-config name="MySQL"> <property name="driverClass">com.mysql.jdbc.Driver</property> <property name="jdbcUrl">jdbc:mysql://localhost:3306/jdbcstudy</property> <property name="user">root</property> <property name="password">123456</property> <property name="acquireIncrement">5</property> <property name="initialPoolSize">10</property> <property name="maxIdleTime">30</property> <property name="maxPoolSize">100</property> <property name="minPoolSize">10</property> </named-config> </c3p0-config>
-
代码实现
-
创建一个utils工具类
package com.lyh.lesson05.utils; import com.mchange.v2.c3p0.ComboPooledDataSource; import org.apache.commons.dbcp.BasicDataSourceFactory; import javax.sql.DataSource; import java.io.InputStream; import java.sql.Connection; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; import java.util.Properties; public class JdbcUtils_C3P0 { private static DataSource dataSource=null; static { try { //配置文件写法 //如果ComboPooledDataSource里面不写参数那就是默认的数据源,写了就是我们锁定的数据源 dataSource=new ComboPooledDataSource("MySQL"); } catch (Exception e) { e.printStackTrace(); } } //获取链接 public static Connection getConnection() throws SQLException { //接口的方法 return dataSource.getConnection();//从数据源获取连接 } //释放资源 public static void close(Connection connection, Statement statement, ResultSet resultSet) throws SQLException { if (resultSet!=null){ resultSet.close(); } if (statement!=null){ statement.close(); } if (connection!=null){ connection.close(); } } }
-
测试C3P0
package com.lyh.lesson05; import com.lyh.lesson05.utils.JdbcUtils_C3P0; import com.lyh.lesson05.utils.JdbcUtils_DBCP; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; public class TestC3P0 { public static void main(String[] args) { Connection conn=null; PreparedStatement ps=null; ResultSet rs=null; try { conn= JdbcUtils_C3P0.getConnection(); String sql="select * from users where id=1;"; ps=conn.prepareStatement(sql); rs=ps.executeQuery(); while (rs.next()){ System.out.println(rs.getInt("id")); System.out.println(rs.getString("name")); System.out.println(rs.getString("password")); System.out.println(rs.getString("email")); System.out.println(rs.getDate("birthday")); } JdbcUtils_C3P0.close(conn,ps,rs); } catch (SQLException e) { e.printStackTrace(); } } }
-
三、Druid:阿里巴巴
-
Druid是什么
-
Druid是阿里开源的连接池,是Java语言中最好的数据库连接池.Druid能够提供强大的监控和扩展功能,是为监控而生的数据库连接池!
-
-
添加依赖
<dependency> <groupId>com.alibaba</groupId> <artifactId>druid</artifactId> <version>1.1.2</version> </dependency>
-
参考配置
<bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource" init-method="init" destroy-method="close"> <!-- 基本属性 url、user、password --> <property name="url" value="${jdbc_url}" /> <property name="username" value="${jdbc_user}" /> <property name="password" value="${jdbc_password}" /> <!-- 配置初始化大小、最小、最大 --> <property name="initialSize" value="1" /> <property name="minIdle" value="1" /> <property name="maxActive" value="20" /> <!-- 配置获取连接等待超时的时间 --> <property name="maxWait" value="60000" /> <!-- 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒 --> <property name="timeBetweenEvictionRunsMillis" value="60000" /> <!-- 配置一个连接在池中最小生存的时间,单位是毫秒 --> <property name="minEvictableIdleTimeMillis" value="300000" /> <property name="validationQuery" value="SELECT 'x'" /> <property name="testWhileIdle" value="true" /> <property name="testOnBorrow" value="false" /> <property name="testOnReturn" value="false" /> <!-- 打开PSCache,并且指定每个连接上PSCache的大小 --> <property name="poolPreparedStatements" value="true" /> <property name="maxPoolPreparedStatementPerConnectionSize" value="20" /> <!-- 配置监控统计拦截的filters --> <property name="filters" value="stat" /> </bean>
四、DBCP和C3P0区别
-
dbcp没有自动的去回收空闲连接的功能c3p0有自动回收空闲连接功能
-
两者主要是对数据连接的处理方式不同!C3P0提供最大空闲时间,DBCP提供最大连接数。 前者当接超过最大空闲连接时间时,当前连接就会被断掉。DBCP当连接数超过最大连接数时,所有连接都会被断开。
-
dbcp它的原理是维护多个连接对象Connection,在web项目要连接数据库时直接使用它维护的对象进行连接,省去每次都要创建连接对象的麻烦。提高效率和减少内存使用。
-
s3p0可以自动回收连接,dbcp需要自己手动释放资源返回。不过dbcp效率比较高。