Hibernate ORM框架——连接池相关

课堂笔记

**********c3p0与hibernate的整合使用*********
1.把hibernate下载包里面的optional文件夹下的3个jar包添加到项目
    a)c3p0 jar文件是c3p0连接池的核心实现
    b) mchange-commons-java是c3p0依赖包
    c)hibernate-c3p0是hibernate整合c3p0使用的一个jar包
    
    
    连接池是可以脱离hibernate单独使用的。
    其它不用hibernate框架的项目要使用c3p0连接池,只需要
    c3p0与mchange-commons两个jar包即可
    
    单独使用c3p0的时候,一般把相关的配置放置在c3p0.properties文件中
    或其它名字的配置文件中,配置文件中,一般会有2个层面的配置
    一个层面是jdbc 链接相关的配置,比如驱动,url,用户名,密码等
    另一个层面的配置就是连接池的相关配置,比如minPoolsize,maxpoolsize等
    
    hibernate整合c3p0使用时,只需要在hibernate.cfg.xml配置文件
    配置c3p0开头的一些连接池设置就可以了,hibernate使用c3p0的逻辑是
    a)看到hibernate.cfg.xml文件中有c3p0的相关配置,hibernate知道需要使用c3p0连接池了
    b)在classpath下查看是否有c3p0相关的jar包
    c)找到后,加载相关类,得到相关的ConnectionProvider
    d)    依据ConnectionProvider就可以得到相关的池化了的Jdbc Connection对象
    
    在hibernate整合c3p0使用时,只需要配置即可,平时的操作与没有使用c3p0的用法是一样的
    hibernate的session对象会自动关联c3p0提供的已经池化的Connection对象

 

 

 

连接池(HibernateStudy_connectionpool项目):

一、需要在lib文件夹里,再导入c3p0-0.9.5.2.jar、hibernate-c3p0-5.2.10.Final.jar、mchange-commons-java-0.2.11.jar,以及MySql的驱动sqljdbc42.jar

二、连接池代码

(1)配置文件

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-configuration PUBLIC
        "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
        "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
    <session-factory>
        <!-- MySQL数据库连接配置 -->
        <property name="connection.driver_class">com.microsoft.sqlserver.jdbc.SQLServerDriver</property>
        <property name="connection.url">jdbc:sqlserver://localhost:1433;databaseName=demo</property>
        <property name="connection.username">sa</property>
        <property name="connection.password"></property>
        <property name="dialect">org.hibernate.dialect.SQLServer2008Dialect</property>
        
        <!-- 配相关的c3p0的关键词 -->
        <property name="c3p0.minPoolSize">4</property>
    
        
        <!-- 设定让hibernate帮我们自动创建表,不设定可以吗? -->
<!--      <property name="hbm2ddl.auto">create</property>  -->
        <property name="show_sql">true</property>
        <property name="format_sql">true</property>

        <mapping resource="shuang/m2m/ClassInfo_m2m.xml"/>

    </session-factory>

</hibernate-configuration>

(2)

实体类

public class ClassInfo {
    private String cid ;
    private String name;
}

实体映射文件

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC
        "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
        "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
        
<hibernate-mapping package="shuang.m2m">
    <class name="ClassInfo" table="CLASSINFO">
        <id name="cid" column="cid">
            <generator class="assigned"></generator>
        </id>
        <property name="name" ></property>
    </class>
</hibernate-mapping>

(3)Main测试方法

package com.nf;


import java.sql.Connection;
import java.sql.SQLException;
import java.util.HashSet;
import java.util.List;
import java.util.Set;

import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.boot.MetadataSources;
import org.hibernate.boot.registry.StandardServiceRegistry;
import org.hibernate.boot.registry.StandardServiceRegistryBuilder;
import org.hibernate.jdbc.Work;

import util.HibernateUtil;

public class Main {

    public static void main(String[] args) {
        
        SessionFactory sf = HibernateUtil.getSessionFactory();
        Session s = sf.openSession();

        s.doWork(new Work(){//接口

            @Override
            public void execute(Connection connection) throws SQLException {
                System.out.println(connection.getClass().getName());
                //测试是否连接c3p0池,成功
                //成功,则显示com.mchange.v2.c3p0.impl.NewProxyConnection
            }
        });

        s.close();
        sf.close();
        
    }
}

 

优化以上代码:

在导入相应的jar包后,删掉配置文件,改成c3p0.properties文件:

(1)c3p0.properties文件

c3p0.driverClass=com.microsoft.sqlserver.jdbc.SQLServerDriver
c3p0.jdbcUrl=jdbc:sqlserver://localhost:1433;databaseName=demo
c3p0.user=sa
c3p0.password=

(2)Main测试

package c3p0pool;

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

import com.mchange.v2.c3p0.ComboPooledDataSource;

public class Main {

    public static void main(String[] args) throws Exception {
/*      ComboPooledDataSource cpds = new ComboPooledDataSource();
        cpds.setDriverClass( "com.microsoft.sqlserver.jdbc.SQLServerDriver" ); //loads the jdbc driver            
        cpds.setJdbcUrl( "jdbc:sqlserver://localhost:1433;databaseName=demo" );
        cpds.setUser("sa");                                  
        cpds.setPassword("");  */                                
         
        ComboPooledDataSource cpds = new ComboPooledDataSource();
        Connection conn = cpds.getConnection();
        System.out.println(conn.getClass().getName());
        conn.close();
    
    }

}

 

 

 

关于连接池的案例说明

(1)水池

package pooldemo;

import java.util.ArrayList;
import java.util.List;

public class WaterPool {
    
    private List<Water> allWaters;
    public WaterPool(){
        allWaters = new ArrayList<Water>();
        allWaters.add(new Water());
        allWaters.add(new Water());
        allWaters.add(new Water());
    }
    public Water getWater(){
        Water w = null;
        if(allWaters.size() >0 ){
            w= allWaters.remove(0);
            w.setPool(this);
        }
        return w;
    }
    
    public void returnWater(Water w){
        allWaters.add(w);
    }
    
    public int haiShengXiaDe(){
        return allWaters.size();
    }
}

 

(2)水

package pooldemo;

public class Water {
    private WaterPool pool;//多对一
    
    public void setPool(WaterPool pool) {
        this.pool = pool;
    }


    public void close() {
        //放回水池里
        pool.returnWater(this);
    }
}

 

(3)Main测试

package pooldemo;

public class PoolTest {

    public static void main(String[] args) {

        WaterPool pool = new WaterPool();
        System.out.println("最开始--" + pool.haiShengXiaDe());
        Water w = pool.getWater();
        System.out.println("拿走一个之后--"+ pool.haiShengXiaDe());

        pool.returnWater(w);
        //    w.close();
        System.out.println("调用w的close之后"+pool.haiShengXiaDe());
    }

}

 

 

 

/*以上个人整理笔记,如果有误或者有不懂的地方,欢迎评论与指出*/

posted @ 2017-08-19 14:45  梁宝谊  阅读(609)  评论(0编辑  收藏  举报