DRUID连接池
阿里出品,淘宝和支付宝专用数据库连接池,但它不仅仅是一个数据库连接池,它还包含一个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分析语义实现的。
配置文件
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
导入jar包
private static DruidDataSource dataSource;
static{
try {
Properties properties=new Properties();
InputStream is = DbUtils_Druid.class.getClassLoader().getResourceAsStream("druid.properties");
properties.load(is);
dataSource= (DruidDataSource) DruidDataSourceFactory.createDataSource(properties);
} catch (Exception e) {
e.printStackTrace();
System.out.println("初始化连接池失败");
}
}
public static Connection getConnection(){
try {
return dataSource.getConnection();
} catch (SQLException e) {
e.printStackTrace();
}
return null;
}
public static void closeAll(Connection conn, Statement stat, ResultSet rs){
try {
if(rs!=null){
rs.close();
}
if(stat!=null){
stat.close();
}
if(conn!=null){
conn.close();
}
} catch (SQLException e) {
e.printStackTrace();
}
}
public static int executeUpdate(String sql,Object...params){ //insert update delete ?????
Connection conn =null;
PreparedStatement pstat=null;
try {
conn = getConnection();
pstat = conn.prepareStatement(sql);
//设置参数
if(params!=null){
for (int i = 0; i < params.length; i++) {
pstat.setObject(i+1, params[i]);
}
}
return pstat.executeUpdate();
} catch (SQLException e) {
e.printStackTrace();
}finally {
closeAll(conn, pstat, null);
}
return -1;
}
//返回List集合的方法
public static <T> List<T> findList(String sql, Class<T> class1,Object... params){
List<T> list=new ArrayList<>();
Connection conn=null;
PreparedStatement pstat=null;
ResultSet rs=null;
//查询数据
try {
conn=getConnection();
pstat = conn.prepareStatement(sql);
if(params!=null){
for (int i = 0; i < params.length; i++) {
pstat.setObject(i+1, params[i]);
}
}
rs = pstat.executeQuery();
//获取rs中的列名
ResultSetMetaData metaData = rs.getMetaData();
while(rs.next()){
//创建一个对象
T t=convertToObject(metaData, rs, class1);
list.add(t);
}
} catch (Exception e) {
e.printStackTrace();
}finally {
closeAll(conn, pstat, rs);
}
return list;
}
//返回单个对象的方法
public static <T> T findSingle(String sql,Class<T> class1,Object...params ){
Connection conn=null;
PreparedStatement pstat=null;
ResultSet rs=null;
//查询数据
try {
conn=getConnection();
pstat = conn.prepareStatement(sql);
if(params!=null){
for (int i = 0; i < params.length; i++) {
pstat.setObject(i+1, params[i]);
}
}
rs = pstat.executeQuery();
//获取rs中的列名
ResultSetMetaData metaData = rs.getMetaData();
if(rs.next()){
//创建一个对象
return convertToObject(metaData, rs, class1);
}
} catch (Exception e) {
e.printStackTrace();
}finally {
closeAll(conn, pstat, rs);
}
return null;
}
public static <T> T convertToObject(ResultSetMetaData metaData,ResultSet rs,Class<T> class1){
try {
T t=class1.newInstance();
for(int i=0;i<metaData.getColumnCount();i++){
String columnLabel=metaData.getColumnLabel(i+1);
Object value = rs.getObject(columnLabel);//empno ename job
//System.out.println(columnLabel+"==="+value);
//创建属性描述符
try {
PropertyDescriptor pd=new PropertyDescriptor(columnLabel, class1);
if(pd!=null){
//System.out.println(pd.getName());
Method writeMethod = pd.getWriteMethod(); //setEmpno setEname setJob
writeMethod.invoke(t,value);
}
} catch (Exception e) {
continue;
}
}
return t;
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
测试类
public void testD(){
for (int i = 0; i <100; i++) {
Connection connection = DbUtils_Druid.getConnection();
System.out.println(connection.hashCode());
}
}
}
没有关闭
@Test
public void testDruid(){
for(int i=0;i<100;i++){
Connection conn = DbUtils_Druid.getConnection();
System.out.println(i+"获取了:"+conn.hashCode());
try {
conn.close();//close()没有关闭,把连接放入池中
} catch (SQLException e) {
e.printStackTrace();
}
}
}