zoukankan      html  css  js  c++  java
  • JavaWeb学习过程 之c3p0的使用

      这几天在学习使用MVC模式来做几个小项目,在学习的过程中,用到了数据库连接池。便特意去学习了一下。

    一、谈一谈为什么要使用数据库连接池

      在开发基于数据库的web程序时,传统的模式(在servlet,beans 中建立数据库链接,进行sql操作, 断开数据库链接) 存在着一些问题。

      每次连接都需要验证用户,消耗了大量的资源和时间。数据库的连接资源并没有得到很好地重复利用。再如,同时几万人在线频繁的连接数据库,系统资源消耗巨大,内存可能泄漏,服务器也可能会崩溃。

    二、什么是数据库连接池

      1.基本思想:可以为数据库建立一个“缓冲池”。预先在缓冲池中放入一定数量的连接,当需要建立数据库连接时,只需要从“缓冲池”中取出一个,使用完毕再放回去,避免了重复连接所消耗的时间与资源。

      

      2.职责:数据库连接池负责分配,管理,和释放数据库链接,它允许应用程序重复使用一个现有的数据库链接,而不是新建立一个。

      

      3.JDBC的数据库链接池使用javax.sql.DataSource 来表示,DataSource 只是一个接口,该接口通常由服务器(Webblogic,Tomact)提供实现,也有一些开源组织提供实现:DBCP,C3P0。

    三、使用C3P0 数据库连接池

      C3P0有两种连接方式。

      1.第一种:

        具体步骤:

          1.导入所需jar包

          2.java代码

          

     1 import java.beans.PropertyVetoException;
     2 import java.sql.Connection;
     3 import java.sql.SQLException;
     4 
     5 import com.mchange.v2.c3p0.ComboPooledDataSource;
     6 
     7 
     8 public class JDBCUtils {
     9     private static Connection conn=null;
    10     private static ComboPooledDataSource comboPooledDataSource=new ComboPooledDataSource();
    11     
    12     public static Connection getConnection(){
    13         try {
    14             comboPooledDataSource.setDriverClass("com.microsoft.sqlserver.jdbc.SQLServerDriver");
    15             comboPooledDataSource.setJdbcUrl("jdbc:sqlserver://localhost:1433;databasename=mysql");
    16             comboPooledDataSource.setUser("sa");
    17             comboPooledDataSource.setPassword("1546873");
    18             
    19             comboPooledDataSource.setAcquireIncrement(5);// 可以设置连接池的各种属性
    20             
    21             conn=comboPooledDataSource.getConnection();
    22         } catch (PropertyVetoException e) {
    23             // TODO Auto-generated catch block
    24             e.printStackTrace();
    25         } catch (SQLException e) {
    26             // TODO Auto-generated catch block
    27             e.printStackTrace();
    28         }
    29         return conn;
    30     }
    31 
    32 }

      2.第二种:

        具体步骤:

          1.导入jar包

          2.配置xml文件。 配置文件名必须名为 c3p0-config.xml 并且放在src目录下

          代码如下

     1 <c3p0-config> 
     2     <named-config name="myc3p0"> 
     3         <property name="user">sa</property> 
     4         <property name="password">ztg591379771</property> 
     5         <property name="driverClass">com.microsoft.sqlserver.jdbc.SQLServerDriver</property> 
     6         <property name="jdbcUrl">jdbc:sqlserver://localhost:1433;databasename=mysql</property> 
     7         
     8         <!-- 若数据库中连接数不足时,一次向数据库服务器申请多少个链接 -->
     9         <!--当连接池中的连接耗尽的时候c3p0一次同时获取的连接数。Default: 3 -->
    10         <property name="acquireIncrement">5</property> 
    11         
    12         
    13         <!--初始化时获取三个连接,取值应在minPoolSize与maxPoolSize之间。Default: 3 -->
    14         <property name="initialPoolSize">10</property> 
    15         
    16         
    17         <!--连接池中保留的最小连接数。-->
    18         <property name="minPoolSize">10</property> 
    19         
    20         
    21         <!--连接池中保留的最大连接数。Default: 15 -->
    22         <property name="maxPoolSize">50</property> <!-- intergalactoApp adopts a different approach to configuring statement caching --> 
    23         
    24         <!--JDBC的标准参数,用以控制数据源内加载的PreparedStatements数量。但由于预缓存的statements
    25             属于单个connection而不是整个连接池。所以设置这个参数需要考虑到多方面的因素。
    26             如果maxStatements与maxStatementsPerConnection均为0,则缓存被关闭。Default: 0-->
    27         <property name="maxStatements">20</property> 
    28         
    29         
    30         <!--maxStatementsPerConnection定义了连接池内单个连接所拥有的最大缓存statements数。Default: 0 -->
    31         <!-- 每个链接可以使用的Statements 对象的个数 -->
    32         <property name="maxStatementsPerConnection">5</property> <!-- he's important, but there's only one of him --> 
    33     
    34     </named-config> 
    35 </c3p0-config>

          3.编写utils工具类

     1 import java.sql.Connection;
     2 import java.sql.SQLException;
     3 
     4 import com.mchange.v2.c3p0.ComboPooledDataSource;
     5 
     6 public class JdbcUtils {
     7     
     8     /**
     9      * 释放链接
    10      * @param connection
    11      */
    12     public static void releaseConnection(Connection connection){
    13         if(connection!=null){
    14             try {
    15                 connection.close();
    16             } catch (SQLException e) {
    17                 // TODO Auto-generated catch block
    18                 e.printStackTrace();
    19             }
    20         }
    21     }
    22     
    23     
    24     private static ComboPooledDataSource dataSource=null;
    25     
    26     static{
    27         //只被创建一次
    28         dataSource=new ComboPooledDataSource("myc3p0");  // myc3p0 一定要与配置文件中的名字一样
    29     }
    30         
    31     /**
    32      * 返回数据源的一个Connection 对象
    33      * @return
    34      * @throws Exception 
    35      */
    36     public static Connection getConnection() throws Exception{
    37         return dataSource.getConnection();
    38     }    
    39 }

      以上是我今天学到的关于c3p0的一些知识,今后在学习的过程中慢慢摸索,逐渐补充。

        

        

      

  • 相关阅读:
    hdu_1072_Nightmare(BFS)
    hdu_4826_Labyrinth_2014百度之星(dp)
    hdu_4823_Energy Conversion
    hdu_3063_Play game
    hdu_3062_Party(2-SAT)
    5、1 部署
    klayge 4.2.0 编译vc9
    数据延迟加载
    指令 scope
    指令 作用域
  • 原文地址:https://www.cnblogs.com/ztg-learn/p/5887059.html
Copyright © 2011-2022 走看看