zoukankan      html  css  js  c++  java
  • 数据库连接池

      连接池是管理连接对象的,是依赖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值,这回获取的就是资源对象了。

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

  • 相关阅读:
    Qt应用如何发布
    关于在windows下部署发布QT程序的总结
    干净地发布QT程序
    解析 Qt 程序在Windows 下发布
    Qt 5.2.0 和 VS 2012集成
    Unable to find a qt build, to solve this problem specify a qt build
    运行python程序不显示cmd的方法
    py2exe使用方法
    python 类
    在Pygtk和Glade使用Gtkbuilder
  • 原文地址:https://www.cnblogs.com/xjs1874704478/p/10927611.html
Copyright © 2011-2022 走看看