zoukankan      html  css  js  c++  java
  • 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());
        }
    
    }

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

  • 相关阅读:
    docker知识集锦
    kubernetes知识集锦
    redis知识集锦
    Java多线程知识集锦
    vscode离线安装插件
    jsoncpp的简易教程
    为什么要自动化测试?
    如何选择正确的自动化测试工具
    如何选择测试自动化工具?
    测试自动化的五大挑战
  • 原文地址:https://www.cnblogs.com/Sunny-lby/p/7396550.html
Copyright © 2011-2022 走看看