它不仅仅是一个数据库连接池,它还包含一个ProxyDriver,一系列内置的JDBC组件库,一个SQL Parser。 支持所有JDBC兼容的数据库,包括Oracle、MySQL、Derby、Postgresql、SQL Server、H2等等。 Druid针对oracle和mysql做了特别优化,比如Oracle的PS Cache内存占用优化,MySql的ping检测优化。Druid提供了MySql、Oracle、Postgresql、SQL-92的SQL的完整支持,这是一个手写的高性能SQL Parser,支持Visitor模式,使得分析SQL的抽象语法树很方便。简单SQL语句用时10微秒以内,复杂SQL用时30微秒。
通过Druid提供的SQL Parser可以在JDBC层拦截SQL做相应处理,比如说分库分表、审计等。Druid防御SQL注入攻击的WallFilter就是通过Druid的SQL Parser分析语义实现的
这个图标是从别人的blog上面copy过了 ,这个是sql语句进行1000次以后的查询提醒druid 连接池的性能分析,大家可以做为参考,是否准确待定。。
这个是在代码中去注册一些配置信息,不常用的 大家随便看看就好
package com.ruirui.druid;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import org.junit.Test;
import com.alibaba.druid.pool.DruidDataSource;
import com.ruirui.decoratedesgin.Utils;
public class DruidDemo {
@Test
public void druidTest(){
Connection conn = null;
PreparedStatement pstmt = null;
ResultSet rs = null;
DruidDataSource dataSource = new DruidDataSource();
dataSource.setDriverClassName("com.mysql.jdbc.Driver");
dataSource.setUrl("jdbc:mysql:///stu");
dataSource.setUsername("root");
dataSource.setPassword("123456");
try{
// 获得连接:
conn = dataSource.getConnection();
// 编写SQL:
String sql = "select * from student";
pstmt = conn.prepareStatement(sql);
// 执行sql:
rs = pstmt.executeQuery();
while(rs.next()){
System.out.println(rs.getInt("id")+" "+rs.getString("name"));
}
}catch(Exception e){
e.printStackTrace();
}finally{
Utils.releaseResouce(rs, ps
tmt, conn);
}
}
}
注册信息在配置文件中
@Test
public void demo2(){
Connection conn = null;
PreparedStatement pstmt = null;
ResultSet rs = null;
try{
Properties properties = new Properties();
properties.load(new FileInputStream("src/druid.properties"));
DataSource dataSource = DruidDataSourceFactory.createDataSource(properties);
// 获得连接:
conn = dataSource.getConnection();
// 编写SQL:
String sql = "select * from account";
pstmt = conn.prepareStatement(sql);
// 执行sql:
rs = pstmt.executeQuery();
while(rs.next()){
System.out.println(rs.getInt("id")+" "+rs.getString("name")+" "+rs.getDouble("money"));
}
}catch(Exception e){
e.printStackTrace();
}finally{
JDBCUtils.release(rs, pstmt, conn);
}
}
配置文件
driverClassName=com.mysql.jdbc.Driver
url=jdbc:mysql:///day04
username=root
password=123
这里配置信息有很多 最大连接数量 , 最小连接数量等。。。配置的信息很多啊 大家可以去读一下官方文档。。 跟C3P0使用的情况 基本上都差不多
> 这里是下载地址druid 文档 jar包 http://pan.baidu.com/s/1jHYEPpk
目前使用C3P0连接池的开源项目有hibernate,spring等,其实所有的连接池都是为了提高应用于数据库自己的访问效率,资源管理等问题,使用的方法还有原理也不会有太大差别
示例代码
// 配置文件的方式
public void demo2(){
Connection conn = null;
PreparedStatement pstmt = null;
ResultSet rs = null;
try{
// 核心类:
ComboPooledDataSource dataSource = new ComboPooledDataSource();
// 获得连接:
conn = dataSource.getConnection();
// 编写SQL:
String sql = "select * from account";
pstmt = conn.prepareStatement(sql);
// 执行sql:
rs = pstmt.executeQuery();
while(rs.next()){
System.out.println(rs.getInt("id")
}
}catch(Exception e){
e.printStackTrace();
}finally{
JDBCUtils.release(rs, pstmt, conn);
}
}
<c3p0-config>
<default-config>
<property name="driverClass">com.mysql.jdbc.Driverproperty>
<property name="jdbcUrl">jdbc:mysql:///day04property>
<property name="user">rootproperty>
<property name="password">123property>
<property name="minPoolSize">5property>
<property name="initialPoolSize">5property>
default-config>
<named-config name="oracle">
<property name="driverClass">com.mysql.jdbc.Driverproperty>
<property name="jdbcUrl">jdbc:mysql:///day04property>
<property name="user">rootproperty>
<property name="password">123property>
<property name="minPoolSize">5property>
<property name="initialPoolSize">5property>
named-config>
c3p0-config>
如果要ComboPooledDataSource comboPooledDataSource = new ComboPooledDataSource("oracle"); 表示的是使用下面的配置文件信息,如果没有找到oracle的话就会使用上图模式配置信息
package com.ruirui.jdbcutils;
import java.sql.Connection;
import java.sql.SQLException;
import java.util.Arrays;
import java.util.List;
import java.util.Map;
import javax.sql.DataSource;
import org.apache.commons.dbutils.QueryRunner;
import org.apache.commons.dbutils.handlers.ArrayHandler;
import org.apache.commons.dbutils.handlers.ArrayListHandler;
import org.apache.commons.dbutils.handlers.BeanHandler;
import org.apache.commons.dbutils.handlers.BeanListHandler;
import org.apache.commons.dbutils.handlers.ColumnListHandler;
import org.apache.commons.dbutils.handlers.KeyedHandler;
import org.apache.commons.dbutils.handlers.MapHandler;
import org.apache.commons.dbutils.handlers.MapListHandler;
import org.apache.commons.dbutils.handlers.ScalarHandler;
import org.junit.Test;
import com.mchange.v2.c3p0.ComboPooledDataSource;
public class JDBCUtils {
/**
* QueryRunner:核心执行类
* ResultSetHandler:提供对查询结果封装
* DbUtils :工具类
*/
//c3p0 连接池
public DataSource comboPooledDataSource = new ComboPooledDataSource();
public Connection getConn() throws SQLException{
return comboPooledDataSource.getConnection();
}
//插入数据
public void saveData() throws SQLException {
QueryRunner queryRunner = new QueryRunner(comboPooledDataSource);
String sql = "insert into student values(null,'ruirui',?,?);";
queryRunner.update(sql, "shenyang",27);
}
// 修改表
public void fixData() throws SQLException{
QueryRunner queryRunner = new QueryRunner(comboPooledDataSource);
String sql = "update student set name=? where id=?;";
queryRunner.update(sql,"pp", 13);
}
// 删除操作
public void demo3() throws SQLException{
QueryRunner queryRunner = new QueryRunner(comboPooledDataSource);
String sql ="delete from account where id =?";
queryRunner.update(sql, 4);
}
// ArrayHandler:将查询到的一条记录封装到数组当中
public void demo1() throws SQLException{
QueryRunner queryRunner = new QueryRunner(comboPooledDataSource);
String sql = "select * from account where id = ?";
Object[] objs = queryRunner.query(sql, new ArrayHandler(), 1); // ”1“ 代表一条数据
System.out.println(Arrays.toString(objs));
}
//ArrayListHandler
//一条查询是ArrayHandler 一个数组
//多条查询 就是将多个数组 存入集合中
public void demo2() throws SQLException {
QueryRunner queryRunner = new QueryRunner(comboPooledDataSource);
String sql = "select * from student";
List
http://pan.baidu.com/s/1c13IXxu