数据库连接池(数据源)2: 开源数据源的使用DBCP和C3P0



一、开源的(数据库连接池)数据源使用
1、DBCP:DataBase Connection Pool
          1.1、需要的jar:commons-dbcp.jar 和 commons-pool.jar
          1.2、把DBCP的配置文件dbcpconfig.properties拷贝到构建路径src中
                  dbcpconfig.properties内容如下
                  ----------------------------------------------------------------
                  #连接设置
                  driverClassName=com.mysql.jdbc.Driver
                  url=jdbc:mysql://localhost:3306/day16
                  username=root
                  password=123456


                  #<!-- 初始化连接 -->
                  initialSize=10


                  #最大连接数量
                  maxActive=50


                  #<!-- 最大空闲连接 -->
                  maxIdle=20


                  #<!-- 最小空闲连接 -->
                  minIdle=5


                  #<!-- 超时等待时间以毫秒为单位 6000毫秒/1000等于60秒 -->
                  maxWait=60000




                  #JDBC驱动建立连接时附带的连接属性属性的格式必须为这样:[属性名=property;] 
                  #注意:"user" 与 "password" 两个属性会被明确地传递,因此这里不需要包含他们。
                  connectionProperties=useUnicode=true;characterEncoding=utf8


                  #指定由连接池所创建的连接的自动提交(auto-commit)状态。
                  defaultAutoCommit=true


                  #driver default 指定由连接池所创建的连接的只读(read-only)状态。
                  #如果没有设置该值,则“setReadOnly”方法将不被调用。(某些驱动并不支持只读模式,如:Informix)
                  defaultReadOnly=


                  #driver default 指定由连接池所创建的连接的事务级别(TransactionIsolation)。
                  #可用值为下列之一:(详情可见javadoc。)NONE,READ_UNCOMMITTED, READ_COMMITTED, REPEATABLE_READ, SERIALIZABLE
                  defaultTransactionIsolation=REPEATABLE_READ
                  ----------------------------------------------------------------                  
          
          1.3、使用到的DBCP工具类
                  *****************************************************************************************************
                  public class DBCPUtil {
                  
                          private static DataSource ds;
                          static{
                                  try {
                                          InputStream in = DBCPUtil.class.getClassLoader().getResourceAsStream("dbcpconfig.properties");
                                          Properties props = new Properties();
                                          props.load(in);
                                          ds = BasicDataSourceFactory.createDataSource(props);
                                  } catch (Exception e) {
                                          e.printStackTrace();
                                  }

                          }


public static DataSource getDataSource(){
return ds;
}

                          
                          public static Connection getConnection(){
                                  try {
                                          return ds.getConnection();
                                  } catch (SQLException e) {
                                          throw new RuntimeException(e);
                                  }
                          }
                          
                          public static void release(ResultSet rs,Statement stmt,Connection conn){
                                  if(rs!=null){
                                          try {
                                                  rs.close();
                                          } catch (SQLException e) {
                                                  e.printStackTrace();
                                          }
                                          rs = null;
                                  }
                                  if(stmt!=null){
                                          try {
                                                  stmt.close();
                                          } catch (SQLException e) {
                                                  e.printStackTrace();
                                          }
                                          stmt = null;
                                  }
                                  if(conn!=null){
                                          try {
                                                  conn.close();
                                          } catch (SQLException e) {
                                                  e.printStackTrace();
                                          }
                                          conn = null;
                                  }
                          }
                  }
              *****************************************************************************************************
              
        1.4、使用例子:    
              *****************************************************************************************************
              public class DaoDemo {
                      @Test
                      public void add(){
                              Connection conn = null;
                              PreparedStatement stmt = null;
                              ResultSet rs = null;
                              try{
                                      conn = DBCPUtil.getConnection();
                                      System.out.println(conn.getClass().getName());
                              }catch(Exception e){
                                      e.printStackTrace();
                              }finally{
                                      DBCPUtil.release(rs, stmt, conn);
                              }
                      }
              }
              *****************************************************************************************************


2、C3P0:是一个机器人的代号
            2.1、 需要的jar:  c3p0-0.9.1.2.jar 和 c3p0-0.9.1.2-jdk1.3.jar 
                                         c3p0-oracle-thin-extras-0.9.1.2.jar(注: 该jar只在连接Oracle数据库时才使用)
            
            2.2、 把C3P0的配置文件c3p0-config.xml拷贝到构建路径src中
                    c3p0-config.xml的配置内容如下:(注:  此处可以配置多个数据库,随时切换,而DBCP只可以配置一个)
                    -----------------------------------------------------------------------------------------------
                    <?xml version="1.0" encoding="UTF-8"?>
                    <c3p0-config>
                            <default-config>
                                    <property name="driverClass">com.mysql.jdbc.Driver</property>
                                    <property name="jdbcUrl">jdbc:mysql://localhost:3306/day16</property>
                                    <property name="user">root</property>
                                    <property name="password">123456</property>
                                    <property name="initialPoolSize">10</property>
                                    <property name="maxIdleTime">30</property>
                                    <property name="maxPoolSize">100</property>
                                    <property name="minPoolSize">10</property>
                                    <property name="maxStatements">200</property>
                            </default-config> 
                            <named-config name="intergalactoApp">
                                    <property name="driverClass">com.mysql.jdbc.Driver</property>
                                    <property name="jdbcUrl">jdbc:mysql://localhost:3306/day16</property>
                                    <property name="user">root</property>
                                    <property name="password">sorry</property>
                                    <property name="initialPoolSize">10</property>
                                    <property name="maxIdleTime">30</property>
                                    <property name="maxPoolSize">100</property>
                                    <property name="minPoolSize">10</property>
                                    <property name="maxStatements">200</property>
                            </named-config>
                    </c3p0-config>
                    -----------------------------------------------------------------------------------------------
                    
            2.3、使用到的C3P0工具类        
                    -----------------------------------------------------------------------------------------------
                    public class C3P0Util {
                    
                            private static ComboPooledDataSource cpds = new ComboPooledDataSource();  
                            
                            public static Connection getConnection(){
                                    try {
                                            return cpds.getConnection();
                                    } catch (SQLException e) {
                                            throw new RuntimeException(e);
                                    }
                            }
                            
                            public static void release(ResultSet rs,Statement stmt,Connection conn){
                                    if(rs!=null){
                                            try {
                                                    rs.close();
                                            } catch (SQLException e) {
                                                    e.printStackTrace();
                                            }
                                            rs = null;
                                    }
                                    if(stmt!=null){
                                            try {
                                                    stmt.close();
                                            } catch (SQLException e) {
                                                    e.printStackTrace();
                                            }
                                            stmt = null;
                                    }
                                    if(conn!=null){
                                            try {
                                                    // 注: 此处close在开源数据源已经被改写了,返回连接到数据库连接池中,而非直接关闭连接 
                                                    conn.close();  
                                            } catch (SQLException e) {
                                                  e.printStackTrace();
                                            }
                                            conn = null;
                                    }
                            }
                            
                    }
                    -----------------------------------------------------------------------------------------------
            
            2.4、使用例子:             
                    -----------------------------------------------------------------------------------------------
                    public class DaoDemo2 {
                            @Test
                            public void add(){
                                    Connection conn = null;
                                    PreparedStatement stmt = null;
                                    ResultSet rs = null;
                                    try{
                                            conn = C3P0Util.getConnection();
                                            System.out.println(conn.getClass().getName());
                                    }catch(Exception e){
                                            e.printStackTrace();
                                    }finally{
                                            C3P0Util.release(rs, stmt, conn);
                                    }
                            }
                    }
                    -----------------------------------------------------------------------------------------------



二、数据库元信息的获取(编写框架时使用)
                
         1、 元数据-DataBaseMetaData:数据库、表、列的定义信息。
               获取数据库的元信息常用方法:
                    Connection.getMetaData()
                    DataBaseMetaData对象
                          getURL():返回一个String类对象,代表数据库的URL。
                          getUserName():返回连接当前数据库管理系统的用户名。
                          getDatabaseProductName():返回数据库的产品名称。
                          getDatabaseProductVersion():返回数据库的版本号。
                          getDriverName():返回驱动驱动程序的名称。
                          getDriverVersion():返回驱动程序的版本号。
                          isReadOnly():返回一个boolean值,指示数据库是否只允许读操作。
                          
          2、 元数据-ParameterMetaData
                获取SQL语句中的占位符信息常用方法:    
                          PreparedStatement . getParameterMetaData() :
                                          获得代表PreparedStatement元数据的ParameterMetaData对象。                                                                    
                          获得指定参数占位符?的个数:   getParameterCount()                                          
                          获得指定参数的sql类型(驱动可能不支持):  getParameterType(int param) 
                                           
          3、 元数据- ResultSetMetaData               
                  获取结果集中的元数据信息常用方法:
                          ResultSet. getMetaData() :
                                    获得代表ResultSet对象元数据的ResultSetMetaData对象。 
                          返回resultset对象的列数:   getColumnCount()                          
                          获得指定列的名称:    getColumnName(int column)                          
                          获得指定列的类型 java.sql.Types: getColumnTypeName(int column)
                          注:  
                                  数据库的列数是从1开始的,所以遍历时角标要加1  
                                  获得指定列的类型时,显示的列类型为数字,在API中的Types中查询定义的常量
                                          有: 4对应INTEGER 7对应REAL 12对应VARCHAR 
                                          
           例:
           ********************************************************************************************
           public class MetaDataDemo {


                  // 获取数据库的元数据信息DataBaseMetaData
                  @Test
                  public void test1() throws Exception{
                          Connection conn = DBCPUtil.getConnection();
                          DatabaseMetaData dbmd = conn.getMetaData();
                          System.out.println(dbmd.getURL());
                          System.out.println(dbmd.getUserName());
                          System.out.println(dbmd.getDatabaseProductName());
                          System.out.println(dbmd.getDatabaseProductVersion());
                          System.out.println(dbmd.getDriverName());
                          System.out.println(dbmd.getDriverVersion());
                          System.out.println(dbmd.isReadOnly());
                          conn.close();
                  }
                  
                  
                  // 获取SQL语句中的占位符信息ParameterMetaData
                  // 获取SQL语句中占位符?的个数
                  @Test
                  public void test2() throws Exception{
                          Connection conn = DBCPUtil.getConnection();
                          PreparedStatement stmt = conn.prepareStatement("insert into t1 values(?,?,?,?,?)");
                          ParameterMetaData pmd = stmt.getParameterMetaData();
                          System.out.println(pmd.getParameterCount());
                          stmt.close();
                          conn.close();
                  }
                  
                  
                  // 获取结果集中的元数据信息: ResultSetMetaDate
                  @Test
                  public void test() throws Exception{
                          Connection conn = DBCPUtil.getConnection();
                          PreparedStatement stmt = conn.prepareStatement("select * from account");
                          ResultSet rs = stmt.executeQuery();
                          ResultSetMetaData rsmd = rs.getMetaData();
                          
                          // 显示结果集列数
                          int count = rsmd.getColumnCount();
                          System.out.println(count);
                          // 显示列名称和列类型 注:数据库是从1开始的,所以要加1  
                          // 注: 此处显示的列类型为数字  4对应INTEGER 7对应REAL 12对应VARCHAR  在API中的Types中查询定义的常量
                          for(int i=0; i<count; i++){
                                  System.out.println("列名:"+rsmd.getColumnName(i+1)+"\t类型:"+rsmd.getColumnType(i+1));
                          }
                          
                          rs.close();
                          stmt.close();
                          conn.close();
                  }
              
            }
           ********************************************************************************************
                                   






















评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值