java的两种数据库连接池(c3p0,dbcp)的使用

菜菜小鸡开启博客的第一天

数据库连接池

数据库连接池是什么

如果一个项目需要多个数据库连接,就要不断获取连接,断开连接,这样大大浪费了资源。而连接池可以管理Connection,在初始化时获取多个Connection对象,这些Connection对象放入LinkedList(双向链表)中,当程序请求连接时,就对LinkedList做removeFirst()操作,从链表的头部获取连接,便可以访问数据库,当程序关闭数据库,做close()操作时,就会对LinkedList做addLast()操作,将连接插回链表的尾部,将Connection归还给池,池就可以再次利用这个Connection对象了,
这里,我们常用的数据库连接池有两种,c3p0dbcp

c3p0

jar包

使用c3p0的话,jar包是必不可少的了,可以去[http://mvnrepository.com/]这里下载需要的jar包,什么都有哦!请注意:如果你下载的jar包是c3p0-0.9.1-pre1.jar包的话,是可以不用mchange-commonsjar包的哦!直接搜索c3p0就可以了l在这里插入图片描述
这个包也是必不可少的哦!否则是找不到连接驱动的
在这里插入图片描述

c3p0配置

首先,列出我的项目结构
在这里插入图片描述
在配置文件c3p0-config.xml中除了最基本的连接驱动driverClass,还有数据库路径jdbcUrl,用户名user,密码password之外,还可以设置连接池的初始容量,最大连接数,最小连接数等。

<?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/product_again?characterEncoding=utf8</property>
        <property name="user">root</property>
        <property name="password"></property>
        <property name="initialPoolSize">30</property>
        <property name="maxPoolSize">10</property>
        <property name="minPoolSize">5</property>
    </default-config>
</c3p0-config>

也可以搜索ComboPooledDataSource.class,里面有更为详细的配置选项
在这里插入图片描述
在这里插入图片描述

c3p0工具类
package c3p0;

import com.mchange.v2.c3p0.ComboPooledDataSource;

import javax.sql.DataSource;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

public class C3P0Util {
    //获取数据源
    static DataSource ds= new ComboPooledDataSource();
    //获取连接
    public static Connection getConnection(){
        try {
            return ds.getConnection();
        } catch (SQLException e) {
            e.printStackTrace();
        }
        return null;
    }

    public static void main(String[] args) {
        Connection connection=getConnection();
        System.out.println(connection);
    }
    //释放资源
    public static void close(Connection conn, ResultSet rs, PreparedStatement ps){
        if (conn!=null){
            try {
                conn.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
        if (rs!=null){
            try {
                rs.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
        if (ps!=null){
            try {
                ps.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
    }
}

c3p0数据操作类

package c3p0;

import java.sql.*;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

public class C3P0Dao {
    public static int update(String sql){
        try {
            Connection conn=C3P0Util.getConnection();
            PreparedStatement ps=conn.prepareStatement(sql);
            int n=ps.executeUpdate();
            C3P0Util.close(conn,null,ps);
            return n;
        } catch (SQLException e) {
            e.printStackTrace();
        }
        return 0;
    }
    public static List<Map<String,Object>> query(String sql){
        List<Map<String,Object>> list=null;
        Connection conn=C3P0Util.getConnection();
        try {
            PreparedStatement ps=conn.prepareStatement(sql);
            ResultSet rs=ps.executeQuery();
            list=resultSetToList(rs);
            C3P0Util.close(conn,rs,ps);
        } catch (SQLException e) {
            e.printStackTrace();
        }
        return list;
    }
    public static List<Map<String,Object>> resultSetToList(ResultSet rs){
        List<Map<String,Object>> list=new ArrayList<>();
        try {
            ResultSetMetaData metaData=rs.getMetaData();
            ArrayList<String> cnames=new ArrayList<>();
            Map<String,Object> map=null;
            for (int i = 1; i <=metaData.getColumnCount() ; i++) {
                cnames.add(metaData.getColumnName(i));
            }
            System.out.println("所有的列"+cnames);
            while (rs.next()){
                map=new HashMap<>();
                for (String cname:cnames){
                    map.put(cname,rs.getObject(cname));
                }
                list.add(map);
            }

        } catch (SQLException e) {
            e.printStackTrace();
        }
        return list;
    }
}

测试类
package c3p0;

import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Set;

public class C3P0Text {
    public static void main(String[] args) {
        String sql="select *from classify";
        List<Map<String,Object>> list=C3P0Dao.query(sql);
        for (Map<String,Object> map:list) {
            for (Map.Entry<String,Object> es:map.entrySet()) {
                System.out.print(es.getKey()+" "+es.getValue()+" ");
            }
            System.out.println();
        }
    }
}

今天就先到这里了,下次再放出dbcp的用法!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值