標籤:info logs res 使用者 dia and 實體映射 整合 driver
課堂筆記
**********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.SQLServerDriverc3p0.jdbcUrl=jdbc:sqlserver://localhost:1433;databaseName=democ3p0.user=sac3p0.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()); }}
/*以上個人整理筆記,如果有誤或者有不懂的地方,歡迎評論與指出*/
Hibernate ORM架構——串連池相關