DBCP(DataBase Connection Pool)
是 apache 上的一个 java 连接池项目,也是 tomcat 使用的连接池组件。单独使用dbcp需要2个包:commons-dbcp.jar,commons-pool.jar由于建立数据库连接是一个非常耗时的行为,所以通过连接池预先同数据库建立一些连接,放在内存中,应用程序需要建立数据库连接时直接到连接池中申请一个就行,用完后再放回去。
添加配置文件
文件名称: dbcp.properties
文件位置: src下
#连接设置
driverClassName=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/school
username=root
password=root
#<!-- 初始化连接 -->
initialSize=10
#最大连接数量
maxTotal=50
#<!-- 最大空闲连接 -->
maxIdle=20
#<!-- 最小空闲连接 -->
minIdle=5
#<!-- 超时等待时间以毫秒为单位 6000毫秒/1000等于60秒 -->
maxWaitMillis=5000
代码示例:
package jdbcdao.test;
import org.apache.commons.dbcp2.BasicDataSource;
import org.apache.commons.dbcp2.BasicDataSourceFactory;
import java.io.IOException;
import java.io.InputStream;
import java.sql.Connection;
import java.sql.SQLException;
import java.util.Properties;
public class DBCP {
//创建连接池对象
private static BasicDataSource dataSource;
//初始化连接池
static {
Properties prop = new Properties();
InputStream is = DBCP.class.getClassLoader().getResourceAsStream("dbcp.properties");
try {
//加载文件
prop.load(is);
dataSource = BasicDataSourceFactory.createDataSource(prop);
} catch (IOException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
System.out.println("初始化连接池失败");
}
}
//创建连接
public static Connection getconnection(){
try {
return dataSource.getConnection();
} catch (SQLException throwables) {
throwables.printStackTrace();
}
return null;
}
}
测试类:
package jdbcdao.test;
import org.junit.Test;
import java.sql.Connection;
import java.sql.SQLException;
public class DBCPTest {
@Test
public void testConnection(){
for (int i = 0; i <50 ; i++) {
Connection conn = DBCP.getconnection();
System.out.println(i+"->"+conn);
try {
conn.close();//把连接放入连接池
} catch (SQLException throwables) {
throwables.printStackTrace();
}
}
}
}
C3P0连接池
C3P0是一个开源的JDBC连接池,它实现了数据源和JNDI绑定,支持JDBC3规范和JDBC2的标准扩展。目前使用它的开源项目有Hibernate,Spring等。
c3p0与dbcp区别
1.
dbcp没有自动回收空闲连接的功能
c3p0有自动回收空闲连接功能
2.
dbcp需要手动加载配置文件
c3p0自动加载
添加配置文件
c3p0是在外部添加配置文件,工具直接进行应用,因为直接引用,所以要求固定的命名和文件位置
文件位置: src
文件命名:c3p0-config.xml/c3p0.properties
c3p0.driverClass=com.mysql.jdbc.Driver
c3p0.jdbcUrl=jdbc:mysql://localhost:3306/school
c3p0.user=root
c3p0.password=root
#每次增长的个数
c3p0.acquireIncrement=5
#初始化大小
c3p0.initialPoolSize=20
#最小
c3p0.minPoolSize=10
#最大
c3p0.maxPoolSize=40
#超时时间
c3p0.checkoutTimeout=5000
注意:
1: c3p0的配置文件内部可以包含命名配置文件和默认配置文件!默认是选择默认配置!如果需要切换命名配置可以在创建c3p0连接池的时候填入命名即可!
2:如果xml配置文件和属性文件都存在时,xml优先级高于属性文件
代码示例:
package jdbcdao.test;
import com.mchange.v2.c3p0.ComboPooledDataSource;
import java.sql.Connection;
import java.sql.SQLException;
import java.util.Properties;
public class C3P0 {
private static ComboPooledDataSource dataSource;
static {
Properties prop = new Properties();
dataSource = new ComboPooledDataSource();
}
public static Connection getconnection(){
try {
return dataSource.getConnection();
} catch (SQLException e) {
e.printStackTrace();
}
return null;
}
}
测试类:
package jdbcdao.test;
import org.junit.Test;
import java.sql.Connection;
import java.sql.SQLException;
public class C3P0Test {
@Test
public void testConnection(){
for (int i = 0; i <50 ; i++) {
Connection conn = C3P0.getconnection();
System.out.println(i+"->"+conn);
try {
conn.close();//把连接放入连接池
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
Druid连接池
Druid 是目前比较流行的高性能的,分布式列存储的OLAP框架(具体来说是MOLAP)。它有如下几个特点:
一. 亚秒级查询
druid提供了快速的聚合能力以及亚秒级的OLAP查询能力,多租户的设计,是面向用户分析应用的理想方式。
二.实时数据注入
druid支持流数据的注入,并提供了数据的事件驱动,保证在实时和离线环境下事件的实效性和统一性
三.可扩展的PB级存储
druid集群可以很方便的扩容到PB的数据量,每秒百万级别的数据注入。即便在加大数据规模的情况下,也能保证时其效性
四.多环境部署
druid既可以运行在商业的硬件上,也可以运行在云上。它可以从多种数据系统中注入数据,包括hadoop,spark,kafka,storm和samza等
五.丰富的社区
druid拥有丰富的社区,供大家学习
配置文件 database.properties:
#连接设置
driverClassName=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/school
username=root
password=root
#<!-- 初始化连接 -->
initialSize=10
#最大连接数量
maxActive=50
#<!-- 最小空闲连接 -->
minIdle=5
#<!-- 超时等待时间以毫秒为单位 6000毫秒/1000等于60秒 -->
maxWait=5000
示例代码:
package jdbcdao.test;
import com.alibaba.druid.pool.DruidDataSource;
import com.alibaba.druid.pool.DruidDataSourceFactory;
import java.io.IOException;
import java.io.InputStream;
import java.sql.Connection;
import java.sql.SQLException;
import java.util.Properties;
public class Druid {
private static DruidDataSource dataSource;
//初始化连接池
static {
Properties prop = new Properties();
InputStream is = DBCP.class.getClassLoader().getResourceAsStream("druid.properties");
try {
//加载文件
prop.load(is);
dataSource = (DruidDataSource)DruidDataSourceFactory.createDataSource(prop);
} catch (IOException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
System.out.println("初始化连接池失败");
}
}
//创建连接
public static Connection getconnection(){
try {
return dataSource.getConnection();
} catch (SQLException throwables) {
throwables.printStackTrace();
}
return null;
}
}
测试类:
package jdbcdao.test;
import org.junit.Test;
import java.sql.Connection;
import java.sql.SQLException;
public class DruidTest {
@Test
public void testConnection(){
for (int i = 0; i <50 ; i++) {
Connection conn = Druid.getconnection();
System.out.println(i+"->"+conn);
try {
conn.close();//把连接放入连接池
} catch (SQLException throwables) {
throwables.printStackTrace();
}
}
}
}
Commons DbUtils是Apache组织提供的一个对JDBC进行简单封装的开源工具类库,使用它能够简化JDBC应用程序的开发,同时也不会影响程序的性能。
DBUtils是java编程中的数据库操作实用工具,小巧简单实用,
1.对于数据表的读操作,可以把结果转换成List,Array,Set等java集合,便于程序员操作。
2.对于数据表的写操作,也变得很简单(只需写sql语句)。
DBUtils包括主要类
DbUtils类:启动类,一般不直接使用。
ResultSetHandler接口:转换类型接口
--ArrayHandler类:实现类,把记录转化成数组
--ArrayListHandler类:把记录转化成数组,并放入集合中
--ColumnListHandler类:取某一列的数据。封装到List中。
–ScalarHandler类:适合获取一行一列数据。
–BeanHandler类:实现类,把记录转成对象。
–BeanListHandler类:实现类,把记录转化成List,使记录为JavaBean类型的对象
QueryRunner类:执行SQL语句的类
dao接口:
package jdbcdao1.dao;
import jdbcdao1.domain.User;
import java.util.List;
public interface Userdao {
List<User> findAll();
User findById(int id);
void add(User user);
void delete(int id);
void updata(User user);
}
具体实现类:
package jdbcdao1.dao.impl;
import jdbcdao1.dao.Userdao;
import jdbcdao1.domain.User;
import jdbcdao1.utils.DataSourceUtils;
import org.apache.commons.dbutils.QueryRunner;
import org.apache.commons.dbutils.handlers.BeanHandler;
import org.apache.commons.dbutils.handlers.BeanListHandler;
import java.sql.SQLException;
import java.util.List;
public class UserdaoImpl implements Userdao {
QueryRunner qr=null;
//查找所有
@Override
public List<User> findAll() {
qr = new QueryRunner(DataSourceUtils.getDataSource());
try {
//BeanListHandler返回集合,BeanHandler返回单个对象,ScalarHandler返回单个值
return qr.query("select * from student", new BeanListHandler<>(User.class));
} catch (SQLException throwables) {
throwables.printStackTrace();
}
return null;
}
//根据id查找对象
@Override
public User findById(int id) {
qr = new QueryRunner(DataSourceUtils.getDataSource());
try {
return qr.query("select * from student where id=?", new BeanHandler<>(User.class),id);
} catch (SQLException throwables) {
throwables.printStackTrace();
}
return null;
}
//添加数据
@Override
public void add(User user) {
qr = new QueryRunner(DataSourceUtils.getDataSource());
Object[] params= {user.getId(),user.getUsername(),user.getPassword(),user.getEamil()};
try {
qr.update("insert into student values(?,?,?,?)",params);
} catch (SQLException throwables) {
throwables.printStackTrace();
}
}
//删除数据
@Override
public void delete(int id) {
qr = new QueryRunner(DataSourceUtils.getDataSource());
try {
qr.update("DELETE FROM student WHERE id=?",id);
} catch (SQLException throwables) {
throwables.printStackTrace();
}
}
//更新数据
@Override
public void updata(User user) {
qr = new QueryRunner(DataSourceUtils.getDataSource());
Object[] params= {user.getUsername(),user.getPassword(),user.getEamil(),user.getId()};
try {
qr.update("update student set username=?,password=?,eamil=?where id=?",params);
} catch (SQLException throwables) {
throwables.printStackTrace();
}
}
}
连接池工具类:
package jdbcdao1.utils;
import com.alibaba.druid.pool.DruidDataSource;
import com.alibaba.druid.pool.DruidDataSourceFactory;
import javax.sql.DataSource;
import java.io.IOException;
import java.io.InputStream;
import java.util.Properties;
public class DataSourceUtils {
private static DruidDataSource dataSource;
//初始化连接池
static {
Properties prop = new Properties();
InputStream is = DataSourceUtils.class.getClassLoader().getResourceAsStream("druid.properties");
try {
//加载文件
prop.load(is);
dataSource = (DruidDataSource) DruidDataSourceFactory.createDataSource(prop);
} catch (IOException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
System.out.println("初始化连接池失败");
}
}
public static DataSource getDataSource(){
return dataSource;
}
}
测试类:
package jdbcdao1.test;
import jdbcdao1.dao.Userdao;
import jdbcdao1.dao.impl.UserdaoImpl;
import jdbcdao1.domain.User;
import org.junit.Test;
import java.util.List;
public class UserdaoTest {
//查找所有测试
@Test
public void testFindAll(){
Userdao userdao = new UserdaoImpl();
List<User> all = userdao.findAll();
for(User l:all){
System.out.println(l.toString());
}
}
//根据id查找对象测试
@Test
public void testFindId(){
Userdao userdao = new UserdaoImpl();
User user = userdao.findById(1);
System.out.println(user.toString());
}
//添加数据测试
@Test
public void testAdd(){
User user = new User(3,"bom","888888","[email protected]");
Userdao userdao = new UserdaoImpl();
userdao.add(user);
System.out.println("执行成功");
}
//更新数据测试
@Test
public void testUpdata(){
User user = new User(3,"tom","99999","[email protected]");
Userdao userdao = new UserdaoImpl();
userdao.updata(user);
System.out.println("执行成功");
}
//删除数据测试
@Test
public void testDelete(){
Userdao userdao = new UserdaoImpl();
userdao.delete(1);
System.out.println("执行成功");
}
}
配置文件:
driverClassName=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/db_test?useSSL=false&characterEncoding=utf8
username=root
password=123456
#<!-- 初始化连接 -->
initialSize=10
#最大连接数量
maxActive=50
#<!-- 最小空闲连接 -->
minIdle=5
#<!-- 超时等待时间以毫秒为单位 6000毫秒/1000等于60秒 -->
maxWait=5000