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()); } }
/*以上个人整理笔记,如果有误或者有不懂的地方,欢迎评论与指出*/