数据库连接池

  连接池是管理连接对象的,是依赖JDBC创建出来的连接Connection,然后管理它。

所以在以下示例中有的需要用到MySQL的驱动和连接池共同使用。

1.封装得到Connection对象

所需MySQL驱动:mysql-connector-java-5.1.7-bin.jar

JdbcUtils.java:

package cn.itcast.jdbc;

import java.io.IOException;
import java.io.InputStream;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.util.Properties;

//v1.0
public class JdbcUtils {
    //私有的 静态对象
    //类中的任何成员函数都可以访问静态变量           但是静态成员函数不能直接访问非静态成员,只能通过该类的
    //对象名访问该对象的非静态成员。这是因为静态成员函数属于整个类的,没有特指向某个对象的this指针
    private static Properties props=null;
    static{
        //给props进行初始化,即加载dbconfig.properties文件到props对象中
        
        //加载配置文件                    取得该class对象类的类装载器
        InputStream in=JdbcUtils.class.getClassLoader()
                .getResourceAsStream("dbconfig.properties");
        props=new Properties();
        
        try {
            props.load(in);
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        
        try {
            Class.forName(props.getProperty("driverClassName"));
        } catch (ClassNotFoundException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }

    public static Connection getConnection() throws SQLException{
        
        /*
         * 1加载配置文件
         * 2加载驱动类
         * 3调用DriverManager
         * */
        return DriverManager.getConnection(props.getProperty("url"), 
                props.getProperty("username"), props.getProperty("password"));
    }
}

其配置文件dbconfig.properties:

driverClassName=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/oa?rewriteBatchedStatements=true
username=root
password=root

2.DBCP数据库连接池

  ----创建的Connection对象可重用。

1)池参数====所有池参数都有默认值

2)连接池也是使用四大连接参数来完成创建连接对象!

DBCP数据库连接池所需jar包

commons-dbcp-1.4.jar依赖commons-pool-1.3.jar

mysql-connector-java-5.1.7-bin.jar

3)底层使用的装饰者模式

Java的JDK中有这个包javax.sql.DataSource(接口)

4)连接池必须实现:javax.sql.DataSource接口!----该接口中有getConnection()方法。这样就可以得到Connection对象!!!

连接池返回的Connection对象,它的close()方法。调用它的close()方法不是关闭,而是把连接归还给池!

代码:---利用数据库连接池得到连接对象

package cn.itcast.jdbc;

import java.sql.Connection;
import java.sql.SQLException;

import org.apache.commons.dbcp.BasicDataSource;
import org.junit.Test;

//DBCP连接池
public class Demo1 {
    @Test
    public void fun1() throws SQLException{
        /*
         * 1.创建连接池对象
         * 2.配置四大参数
         * 3.配置池参数
         * 4.得到连接对象 
         * */
        BasicDataSource dataSoure=new BasicDataSource();
        dataSoure.setDriverClassName("com.mysql.jdbc.Driver");
        dataSoure.setUrl("jdbc:mysql://localhost:3306/oa");
        dataSoure.setUsername("root");
        dataSoure.setPassword("root");
        
        //池参数
        dataSoure.setMaxActive(20);//最大活动连接数
        dataSoure.setMinIdle(3);//最小空闲连接数
        dataSoure.setMaxWait(1000);//最长等待时间(毫秒)
        
        Connection con=dataSoure.getConnection();
        System.out.println(con.getClass().getName());
        
        /*
         * 连接池内部使用四大参数创建了连接对象!即MySQL驱动提供的Connection
         * 连接池使用MySQL的连接对象进行了装饰,只对close()方法进行了增强!
         * 装饰之后的Connection的close()方法,用来把当前连接归还给池!
         * 
         * */
        con1.close();//把连接归还给池
    }
}

结果:org.apache.commons.dbcp.PoolingDataSource$PoolGuardConnectionWrapper

对close方法进行装饰!!!

 

 

3.C3P0连接池

1)C3P0也是开源免费的连接池!

2)C3P0的使用

  C3P0中池类是:ComboPooledDataSource

3)所需jar包

 

 c3p0-0.9.2-pre1.jar

mchange-commons-0.2.jar

mysql-connector-java-5.1.7-bin.jar

4)底层使用的是动态代理

5)代码实现:---代码配置

package cn.itcast.demo1;

import java.beans.PropertyVetoException;
import java.sql.Connection;
import java.sql.SQLException;

import org.junit.Test;

import com.mchange.v2.c3p0.ComboPooledDataSource;

//c3p0
public class Demo1 {
    @Test
    public void fun1() throws PropertyVetoException, SQLException{
        //创建连接池对象
        ComboPooledDataSource cd=new ComboPooledDataSource();
        //配置四大参数
        cd.setDriverClass("com.mysql.jdbc.Driver");
        cd.setJdbcUrl("jdbc:mysql://localhost:3306/oa");
        cd.setUser("root");
        cd.setPassword("root");
        //池配置
        cd.setAcquireIncrement(5);
        cd.setInitialPoolSize(20);
        cd.setMinPoolSize(2);
        cd.setMaxPoolSize(50);
        
        Connection con=cd.getConnection();
        System.out.println(con);
        con.close();//把链接归还给池
        
    }
}
//控制台里的红色时日志,可以修改log4j把它干掉

结果:com.mchange.v2.c3p0.impl.NewProxyConnection@367a8bd9

 底层是动态代理实现的

配置文件

配置文件要求:

  * 文件名称:必须叫c3p0-config.xml

  * 文件位置:必须放在src下

6)配置文件(默认)配置:---得到连接

c3p0-config.xml:

<?xml version="1.0" encoding="UTF-8" ?>
<c3p0-config>
    <!-- 默认配置信息 -->
    <default-config> 
        <!-- 连接四大参数配置 -->
        <property name="jdbcUrl">jdbc:mysql://localhost:3306/oa</property>
        <property name="driverClass">com.mysql.jdbc.Driver</property>
        <property name="user">root</property>
        <property name="password">root</property>
        <!-- 池参数配置 -->
        <property name="acquireIncrement">3</property>
        <property name="initialPoolSize">10</property>
        <property name="minPoolSize">2</property>
        <property name="maxPoolSize">10</property>
    </default-config>
</c3p0-config>

测试:

    //配置文件的默认配置
    @Test
    public void fun2() throws SQLException{
        //在创建连接池对象时,这个对象就会自动加载配置文件!不用我们来指定
        ComboPooledDataSource dataSource=new ComboPooledDataSource();
        
        Connection con=dataSource.getConnection();
        System.out.println(con);
        con.close();
        
    }

结果:com.mchange.v2.c3p0.impl.NewProxyConnection@27736f80

如果在该测试中写入各参数的配置,则会覆盖掉配置文件!!!

7)命名的配置

c3p0-config.xml:

<?xml version="1.0" encoding="UTF-8" ?>
<c3p0-config>
    <!-- 专门为oracle提供的信息 -->
    <named-config name="oracle-config"> 
        <!-- 连接四大参数配置 -->
        <property name="jdbcUrl">jdbc:mysql://localhost:3306/oa</property>
        <property name="driverClass">com.mysql.jdbc.Driver</property>
        <property name="user">root</property>
        <property name="password">root</property>
        <!-- 池参数配置 -->
        <property name="acquireIncrement">3</property>
        <property name="initialPoolSize">10</property>
        <property name="minPoolSize">2</property>
        <property name="maxPoolSize">10</property>
    </named-config>
</c3p0-config>

测试:

    //使用命名配置信息
        @Test
        public void fun3() throws SQLException{
            //构造器的参数指定命名配置元素的名称<named-config name="oracle-config">
            ComboPooledDataSource dataSource=new ComboPooledDataSource("oracle-config");
            
            Connection con=dataSource.getConnection();
            System.out.println(con);
            con.close();
            
        }

结果:com.mchange.v2.c3p0.impl.NewProxyConnection@297cebc9

4.重新封装JdbcUtils这个类(里面是由连接池得到的连接)

package cn.itcast.jdbc;

import java.sql.Connection;
import java.sql.SQLException;

import javax.sql.DataSource;

import com.mchange.v2.c3p0.ComboPooledDataSource;

public class JdbcUtils {
    //使用文件的默认配置,要求必须给出c3p0-config.xml
    private static ComboPooledDataSource dataSource=new ComboPooledDataSource();
    //使用连接池返回一个连接对象
    public static Connection getConnection() throws SQLException{
        return dataSource.getConnection();
    }
    
    //返回连接池对象
    public static DataSource getDataSource(){
        return dataSource;
    }
}

使用的是默认的配置文件!

5.Tomcat配置连接池===(配置后可以得到连接池对象,再去得到连接对象)

1)Tomcat配置JNDI资源

  JNDI(Java Naming and Directory Interface),Java命名和目录接口,JNDI的作用就是:在服务器上配置资源,然后通过统一的方式来获取配置的资源。

  我们这里要配置的资源是连接池,这样项目中就可以通过统一的方式来获取连接池对象。

 

配置JNDI资源需要到<Context>元素中配置<Resource>子元素:

  * name:指定资源的名称,这个名称可以随便给,在获取资源时需要这个名称;

  * factory:用来创建资源的工厂,这个值基本上是固定的,不用修改;

  * type:资源的类型,我们需要给出的类型当然是我们连接池的类型了;

  * bar:表示资源的属性,如果资源存在名为bar的属性,那么就配置bar的值。对于DBCP连接池而言,你需要配置的不是bar,因为它没有bar这个属性,而是应该去配置url、username等属性。

 2)获取资源

  配置资源的目的当然是为了获取资源。只要你启动了Tomcat,那么就可以在项目中任何类中通过JNDI获取资源的方式来获取资源了。

 

获取资源:

  * Context:javax.naming.Context;

  *InitialContext:javax.naming.InitialContext;

  *lookup(String):获取资源的方法,其中“javax:comp/env”是资源的入口(这是固定的名称),获取过来的还是一个Context,这说明需要在获取到的Context上进一步进行获取。“bean/MyBeanFactory”对应<Resource>中配置的name值,这回获取的就是资源对象了。

=======在电脑上测试没有成功======

 

转载于:https://www.cnblogs.com/xjs1874704478/p/10927611.html

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值