DBCP连接池介绍
DBCP(DataBase connection pool),数据库连接池。是 apache 上的一个 java 连接池项目,也是 tomcat 使用的连接池组件。
单独使用dbcp需要2个包:commons-dbcp.jar,commons-pool.jar由于建立数据库连接是一个非常耗时耗资源的行为,所以通过连接池预先同数据库建立一些连接,放在内存中,应用程序需要建立数据库连接时直接到连接池中申请一个就行,用完后再放回去。
@Test
public void testHard() throws SQLException{
//1.TODO 硬编码 使用DBCP连接池子
BasicDataSource source = new BasicDataSource();
//2.设置连接的信息
source.setDriverClassName("com.mysql.jdbc.Driver");
source.setUrl("jdbc:mysql://localhost:3306/day2");
source.setUsername("root");
source.setPassword("111");
//3.获取连接
Connection connection = source.getConnection();
//4.执行sql语句
String sql = "select * from student";
Statement createStatement = connection.createStatement();
ResultSet executeQuery = createStatement.executeQuery(sql);
//5.获取结果
while (executeQuery.next()) {
System.out.println(executeQuery.getString(2));
}
//6.关闭连接
connection.close(); //回收
}
项目中添加配置 --> info.properties
info.properties
,其实无所谓,文件名随便起info.properties
在工具类的同级目录下同级目录下info.properties
的文件内容
#连接设置
driverClassName=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/day2
username=root
password=111
#
initialSize=10
#最大连接数量
maxActive=50
#
maxIdle=20
#
minIdle=5
#
maxWait=6000
@Test
public void testSoft() throws Exception{
//1.TODO DBCP软编码连接池子使用
BasicDataSourceFactory factory = new BasicDataSourceFactory();
//2.info.properties配置文件添加到properties对象中 javase
Properties properties = new Properties();
properties.load(DBCPUtils2.class.getResourceAsStream("info.properties"));
//3.生成连接池子 需要配置文件
DataSource source = factory.createDataSource(properties);
//4.获取连接
Connection connection = source.getConnection();
//5.执行sql语句
String sql = "select * from student";
Statement createStatement = connection.createStatement();
//6.获取结果
ResultSet executeQuery = createStatement.executeQuery(sql);
while (executeQuery.next()) {
System.out.println(executeQuery.getString(2));
}
//7.关闭连接
connection.close(); //回收
}
c3p0介绍
C3P0是一个开源的JDBC连接池,它实现了数据源和JNDI绑定,支持JDBC3规范和JDBC2的标准扩展。目前使用它的开源项目有Hibernate,Spring等。
c3p0与dbcp的区别
1.区别一
dbcp没有自动回收空闲连接的功能
c3p0有自动回收空闲连接功能
2.区别二
dbcp需要手动设置配置文件
c3p0不需要手动设置
这种方式要导三个包
这种方式只用导入两个包(区别在于c3p0包的版本不用,和mysql连接包版本没关系)
配置文件要求
c3p0是在外部添加配置文件,工具直接进行应用,因为直接引用,所以要求固定的命名和文件位置
文件位置:src
文件命名:c3p0-config.xml(xml文件必须这个名字,properties无所谓)
使用xml配置文件内容
<c3p0-config>
<default-config>
<property name="driverClass">com.mysql.jdbc.Driverproperty>
<property name="jdbcUrl">jdbc:mysql://localhost:3306/day2property>
<property name="user">rootproperty>
<property name="password">111property>
<property name="checkoutTimeout">30000property>
<property name="idleConnectionTestPeriod">30property>
<property name="initialPoolSize">10property>
<property name="maxIdleTime">30property>
<property name="maxPoolSize">100property>
<property name="minPoolSize">10property>
<property name="maxStatements">200property>
default-config>
<named-config name="zhaowf">
<property name="driverClass">com.mysql.jdbc.Driverproperty>
<property name="jdbcUrl">jdbc:mysql://localhost:3306/day2property>
<property name="user">rootproperty>
<property name="password">111property>
<property name="acquireIncrement">5property>
<property name="initialPoolSize">20property>
<property name="minPoolSize">10property>
<property name="maxPoolSize">40property>
<property name="maxStatements">20property>
<property name="maxStatementsPerConnection">5property>
named-config>
c3p0-config>
基本配置和命名配置的区别
基本配置是默认使用的配置
命名配置需要指定使用,故可以添加多种配置应对不同情况下使用
使用方式,在创建ComboPooledDataSource dataSource对象时,我的配置中另一个名字叫zhaowf
,所以参数就是zhaowf
。即:
new ComboPooledDataSource dataSource("zhaowf")
c3p0的配置文件内部可以包含命名配置文件和默认配置文件!默认是选择默认配置!如果需要切换命名配置可以在创建c3p0连接池的时候填入命名即可!
使用c3p0.properties配置文件内容
c3p0.JDBC.url=jdbc:mysql://localhost:3306/ms_cms?characterEncoding=utf8
c3p0.DriverClass=com.mysql.jdbc.Driver
c3p0.user=root
c3p0.pwd=123
c3p0.acquireIncrement=3
c3p0.idleConnectionTestPeriod=60
c3p0.initialPoolSize=10
c3p0.maxIdleTime=60
c3p0.maxPoolSize=20
c3p0.maxStatements=100
c3p0.minPoolSize=5
properties中的内容,key取什么名字都无所谓。。。艹,真没意思,发泄一下
注意
首先,c3p0一般不使bai用proerties文件来做配du置文件,dbcp一般才zhi用properties文件做配置文件。而daoc3p0一般使用xml文件做配置文件,而且c3p0连接池不需要自己手动读配置文件,因为你只要你使用上面的代码,new()一个ComboPooledDataSource()对象的时候,c3p0的jar包里面的代码会自动帮你读取你放在lib下面的jar包,不过c3p0的配置文件名必须是c3p0-config.xml,否则会无法读取。
public class C3P0Utils {
//建立连接源头
private static ComboPooledDataSource dataSource = new ComboPooledDataSource();
static {
File file = new File("c3p0-config.properties");
try {
Properties pro = new Properties();
pro.load(C3P0Utils.class.getResourceAsStream("db.properties"));
dataSource.setDriverClass(pro.getProperty("DriverClass"));
dataSource.setJdbcUrl(pro.getProperty("JDBC.url"));
dataSource.setUser(pro.getProperty("user"));
dataSource.setPassword(pro.getProperty("pwd"));
} catch (IOException | PropertyVetoException e) {
e.printStackTrace();
}
}
//获取链接源
public static DataSource getDataSource() {
return dataSource;
}
//获取连接
public static Connection getConnection() {
Connection con = null;
try {
con = dataSource.getConnection();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return con;
}
}
c3p0的工具类,使用xml配置的写法
/**
* 从连接池子中获取连接!
*
* C3P0的连接池子
* 0.获取连接池子对象 DBUtils
* 1.获取连接
* 2.关闭资源
*/
public class DataSourceUtils {
private static ComboPooledDataSource dataSource = new ComboPooledDataSource();
/**
* 返回连接池对象方法
* @return c3p0连接池子
*/
public static ComboPooledDataSource getDataSource(){
return dataSource;
}
/**
* 连接池中获取连接的方法
* @return 连接
*/
public static Connection getConnection(){
Connection conn = null;
try {
conn = dataSource.getConnection();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return conn;
}
//关闭资源
public static void close(Connection conn){
if (conn != null) {
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
public static void close(Statement st){
if (st != null) {
try {
st.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
public static void close(ResultSet set){
if (set != null) {
try {
set.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
public static void close(Connection conn,Statement st){
close(conn);
close(st);
}
public static void close(Connection conn,Statement st,ResultSet rt){
close(conn);
close(st);
close(rt);
}
}
注意:如果使用其他名字的配置时,但没有该名字配置,则使用默认配置(猜测的)
猜测原因:删除默认配置后,在上述情况后无法获取到参数,但有默认配置就可以获取到
使用工具类
public class TestC3p0 {
public static void main(String[] args) throws Exception {
//c3p0连接池会自动获取配置文件中的内容,只要配置文件的位置和名称无误
//1.创建C3P0连接池子
Connection connection = DataSourceUtils.getConnection();
//2.使用sql语句
Statement createStatement = connection.createStatement();
String sql = "select * from student;";
//3.获取结果
ResultSet resultSet = createStatement.executeQuery(sql);
while (resultSet.next()) {
System.out.println(resultSet.getString(1));
}
//4.关闭连接
DataSourceUtils.close(connection, createStatement, resultSet);
}
}
Druid 是目前比较流行的高性能的,分布式列存储的OLAP框架(具体来说是MOLAP)。
Druid 由alibaba提供。
它有如下几个特点:
一. 亚秒级查询
druid提供了快速的聚合能力以及亚秒级的OLAP查询能力,多租户的设计,是面向用户分析应用的理想方式。
二.实时数据注入
druid支持流数据的注入,并提供了数据的事件驱动,保证在实时和离线环境下事件的实效性和统一性
三.可扩展的PB级存储
druid集群可以很方便的扩容到PB的数据量,每秒百万级别的数据注入。即便在加大数据规模的情况下,也能保证时其
效性
四.多环境部署
druid既可以运行在商业的硬件上,也可以运行在云上。它可以从多种数据系统中注入数据,包括hadoop,spark,
kafka,storm和samza等
五.丰富的社区
druid拥有丰富的社区,供大家学习
配置文件要求
文件位置:java文件同级目录下
文件名字:db.properties
(起什么名字也都无所谓,有所谓是那种会自动读取文件的)
好像只有c3p0有这个功能。
配置文件内容
driverClassName=com.mysql.jdbc.Driver //驱动加载
url=jdbc:mysql://127.0.0.1:3306/student?characterEncoding=utf-8 //注册驱动
username=root //连接数据库的用户名
password=sjw58586 //连接数据库的密码。
filters=stat //属性类型的字符串,通过别名的方式配置扩展插件, 监控统计用的stat 日志用log4j 防御sql注入:wall
initialSize=2 //初始化时池中建立的物理连接个数。
maxActive=300 //最大的可活跃的连接池数量
maxWait=60000 //获取连接时最大等待时间,单位毫秒,超过连接就会失效。配置了maxWait之后,缺省启用公平锁,并发效率会有所下降, 如果需要可以通过配置useUnfairLock属性为true使用非公平锁。
timeBetweenEvictionRunsMillis=60000 // 连接回收器的运行周期时间,时间到了清理池中空闲的连接,testWhileIdle根据这个判断
minEvictableIdleTimeMillis=300000
validationQuery=SELECT 1 //用来检测连接是否有效的sql,要求是一个查询语句。
testWhileIdle=true //建议配置为true,不影响性能,并且保证安全性。 申请连接的时候检测,如果空闲时间大于timeBetweenEvictionRunsMillis, 执行validationQuery检测连接是否有效。
testOnBorrow=false //申请连接时执行validationQuery检测连接是否有效,做了这个配置会降低性能。设置为false
testOnReturn=false //归还连接时执行validationQuery检测连接是否有效,做了这个配置会降低性能,设置为flase
poolPreparedStatements=false //是否缓存preparedStatement,也就是PSCache。
maxPoolPreparedStatementPerConnectionSize=200 // 池中能够缓冲的preparedStatements语句数量
注意:
properties配置文件不能有空格,值不能有双引号,也不能写分号。
编写工具类(推荐这种,下面还有一中不推荐,相信也没几个会那么用)
/**
* 阿里的数据库连接池
* 性能最好的
* Druid
* */
public class DruidUtils {
private static DataSource dataSource = null;
static {
Properties pro = new Properties();
try {
pro.load(DruidUtils.class.getResourceAsStream("db.properties"));
dataSource = DruidDataSourceFactory.createDataSource(pro);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
//3.获取连接源
public static DataSource getDataSource() {
return dataSource;
}
//4.获取连接
public static Connection getConnection() {
try {
return dataSource.getConnection();
} catch (SQLException e) {
e.printStackTrace();
}
return null;
}
}
编写工具类(不推荐的),注意和上面代码的区别,首先实例变量就不完全一样。
public class DruidUtils2 {
//1.创建连接池
private static ComboPooledDataSource dataSource = new ComboPooledDataSource();
//2.info.properties配置文件添加到properties对象中 javas
static {
Properties properties = new Properties();
try {
properties.load(DBCPUtils2.class.getResourceAsStream("info.properties"));
dataSource.setDriverClass(properties.getProperty("driverClassName"));
dataSource.setJdbcUrl(properties.getProperty("url"));
dataSource.setUser(properties.getProperty("username"));
dataSource.setPassword(properties.getProperty("password"));
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} catch (PropertyVetoException e) {
e.printStackTrace();
}
}
//3.获取连接源
public static DataSource getDataSource() {
return dataSource;
}
//4.获取连接
public static Connection getConnection() {
try {
return dataSource.getConnection();
} catch (SQLException e) {
e.printStackTrace();
}
return null;
}
}