首页 > 技术文章 > 线程池

SkyGood 2014-10-14 13:41 原文

    一】原理
    ·传统的:
        1)JDBC传统方式找DriverMannager要连接,而这个连接的数目是有限的。
        2)传统方式的close(),并未将Connection重用,只是切断应用程序和数据库的桥梁,即无SQL语句发送到数据库。
        3)项目中,对于Connection不会直接使用DriverMannager取得,而使用连接池方式取得。
        4)DBCP和C3P0都是开源的连接池,都必须直接或间接实现javax.sql.DataSource接口
    ·连接池
        1)示意图
        
        2)开源的连接池
                    DBCP数据库连接池(tomcat)
                    C3P0数据库连接池(hibernate)
                    
    二】DBCP连接池(tomcat):需要利用Properties属性文件进行配置
        重点类:
            1)BasicDataSourceFactory //连接池工厂
                重点方法:
                static DataSource createDataSource(Properties properties);//创建一个连接池
            2)DataSource
                Conncetion getConncetion();
        code:
            //配置文件:

                driverClassName=com.mysql.jdbc.Driver
                url=jdbc:mysql://127.0.0.1:3306/jdbc
                username=root
                password=root        

          

    //JavaCode

              // 创建一个线程池工厂
                BasicDataSourceFactory factory = new         BasicDataSourceFactory();
                // 加载properties配置文件
                Properties prop = new Properties();
                InputStream is = Thread.currentThread().getClass()
                        .getResourceAsStream("/dbcp.properties");
                prop.load(is);
                DataSource dataSource = factory.createDataSource(prop);
                long start = System.currentTimeMillis();
                for (int i = 1; i <= 50000; i++) {
                    //从连接池中取得一个连接
                    Connection conn = dataSource.getConnection();
                    System.out.println(i + " :个连接");
                    //释放一个连接给连接池
                    conn.close();
                }
                long end = System.currentTimeMillis();
                System.out.println("共用了"+ (end-start)/1000 +"秒");        

 


       
    三】C3P0连接池(hibernate):Connectin和"Statement族类"都重用了!!! 需要配置XML文件
        1)重点类:
            ComboPooledDataSource //创建C3P0连接池的关键类
            重点方法:
                Connection getConnection();//得到一个C3P0连接池中的连接
        code:
            配置文件:

       //c3p0-config.xml  【!名字不能乱取!并且一定要放到src目录下,即编译后的项目的/WEB-INF/classes目录下】
            <?xml version="1.0" encoding="UTF-8"?>
            <c3p0-config>
                <default-config>
                    <property name="driverClass">com.mysql.jdbc.Driver</property>
                    <property name="user">root</property>
                    <property name="password">568231252</property>
                    <property name="jdbcUrl">jdbc:mysql://127.0.0.1:3306/jdbc</property>
                </default-config>
            </c3p0-config>

 

 

      //JavaCode

            //Demo.java
            ComboPooledDataSource dataSource = new ComboPooledDataSource();
            long start = System.currentTimeMillis();
            for (int i = 1; i <= 50000; i++) {
                Connection conn = dataSource.getConnection();
                System.out.println(i + " :个连接");
                conn.close();
            }
            long end = System.currentTimeMillis();
            System.out.println("共用了" + (end - start) / 1000 + "秒");


    四】DBCP连接池和C3P0连接池对比
        1)DBCP连接池需要dbcp.properties文件,同时需要添加3个对应的jar包
        2)C3P0连接池需要在/WEB-INF/classes目录下(IDE即为src下)存放存放c3p0-config.xml文件,并且名字不能改
        3)ComboPooledDatasource在创建时会自动在指定的目录下找xml文件,并加载默认设置

推荐阅读