c3p0和druid数据库连接池

c3p0和druid数据库连接池

前言

| 编程知识点繁多,许多文章又是用专业名词来解释专业名词,对我这种小白十分不友好,今天用大白话简单整理下数据库连接池技术。

简介

传统jdbc

| java里传统连接数据库是用的jdbc,这个大大滴不好,因为要反复连接反复释放,特别浪费资源,

啥是连接池

对于重复利用的共享资源,建议使用资源池设计模式(Resource Pool),就是先在池子中放几个连接,谁用谁拿,用完放回去,就不用反复多次的连接释放了

为啥要有连接池

解决反复用jdbc连接数据库造成的资源浪费

怎么建立连接池

以下面两个例子展示

c3p0

导入jar

| 下载地址:下载地址

配置文件

| 在src下新建文件(file)c3p0-config.xml 复制下面代码改下数据源:

<c3p0-config>
   <!--使用默认配置读取连接池对象-->
    <default-config>
    <!--连接参数 需要改成自己的参数-->
    <property name="driverClass" >com.mysql.cj.jdbc.Driver</property>
    <property name="jdbcUrl" >jdbc:mysql://localhost:3306/oldproject?serverTimezone=GMT</property>
    <property name="user" >root</property>
    <property name="password" >123456</property>
    
    <!--连接池参数-->
    <property name="initialPoolSize">5</property><!--初始化数量-->
    <property name="maxPoolSize">10</property><!--最大数量-->
    <property name="checkoutTimeout">3000</property><!--超时时间-->
    </default-config>
	
	<!--自己命名的连接-->
    <name-config name="otherc3p0">
        <!--连接参数-->
        <property name="driverClass" >com.mysql.cj.jdbc.Driver</property>
        <property name="jdbcurl" >jdbc:mysql://localhost:3306/zzydb</property>
        <property name="user" >root</property>
        <property name="password" >123456</property>
        <!--连接池参数-->
        <property name="initialPoolSize">5</property>
        <property name="maxPoolSize">8</property>
        <property name="checkoutTimeout">1000</property>

    </name-config>

</c3p0-config>

测试连接

| 代码:

public class C3p0Demo1 {
    public static void main(String[] args) throws SQLException {
        /**
         * 创建数据库连接池对象
         */
        DataSource ds = new ComboPooledDataSource();
        /**
         * 获取连接
         */
        Connection conn = ds.getConnection();
        /**
         *打印连接
         */
        System.out.println(conn);
    }
}

控制台输出

红色是日志信息不是报错,最后一串就是打印出来的连接,到这就已经连接上了,具体的数据操作和jdbc基本一致。
c3p0和druid数据库连接池

Druid

导入jar包

| 下载地址:下载地址

配置文件

| 新建druid.properties文件如下:我这里用了8版本mysql,注意时区,和c3p0配置文件基本一致

url=jdbc:mysql://localhost:3306/oldproject?serverTimezone=GMT
driverClassName=com.mysql.cj.jdbc.Driver
username=root
password=123456
##初始连接数,默认0
initialSize=5
#最大连接数,默认8
maxActive=10
#最小闲置数
minIdle=10
#获取连接的最大等待时间,单位毫秒
maxWait=2000
#缓存PreparedStatement,默认false
poolPreparedStatements=true
#缓存PreparedStatement的最大数量,默认-1(不缓存)。大于0时会自动开启缓存PreparedStatement,所以可以省略上一句设置
maxOpenPreparedStatements=20

测试连接

| 代码:因为不是必须要求在src下,需要自己手动使用类加载器加载,学反射案例也用到这个

public class DruidDemo {
    public static void main(String[] args) throws Exception {
        /**
         * 加载配置文件
         */
        InputStream is = DruidDemo.class.getClassLoader().getResourceAsStream("druid.properties");
        Properties pro = new Properties();
        pro.load(is);
        /**
         * 获取连接池对象
         */
        DataSource ds = DruidDataSourceFactory.createDataSource(pro);
        /**
         * 获取连接,连接次数为11次,超过配置中最大数量
         */
        for (int i = 0; i < 11; i++) {
            Connection conn = ds.getConnection();
            System.out.println(i+": "+conn);
        }


    }
}

控制台输出

因为配置文件中设置最大连接数量为10,而我新建11个,所以会报错,而且是前10个没问题(0-9),在生成第十一个时候,超时2秒后报错。
使用连接必须归还,close()方法在这里不再是关闭连接,而是放回连接池中!
c3p0和druid数据库连接池

上一篇:一个job


下一篇:小白救星-SpringBoot最简教程06:web开发实战