hibernate動態數據源之跨db server

package ly.test;

import java.io.IOException;
import java.sql.Connection;
import java.sql.SQLException;
import java.util.Properties;
import ly.po.Param;
import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.transform.Transformers;
import org.springframework.orm.hibernate4.LocalSessionFactoryBean;
import com.mchange.v2.c3p0.ComboPooledDataSource;

public class MyConfiguration {
	
	/**
	 * 獲取 dataSource鏈接池 
	 * 方法內設置的屬性值能夠放在參數中,方便動態封裝
	 * @return c3p0數據源
	 */
	public ComboPooledDataSource getDataSource(){
		ComboPooledDataSource cpds=new ComboPooledDataSource();
		try{
			cpds.setDriverClass("com.mysql.jdbc.Driver");
			cpds.setJdbcUrl("jdbc:mysql://127.0.0.1:3306/oa_db_center?useUnicode=true&characterEncoding=utf8");
			cpds.setUser("root");
			cpds.setPassword("root");
			//鏈接池中保留的最小鏈接數。
			cpds.setMinPoolSize(5);
			//鏈接池中保留的最大鏈接數。Default: 15
			cpds.setMaxPoolSize(60);
			//初始化時獲取的鏈接數,取值應在minPoolSize與maxPoolSize之間。Default: 3 
			cpds.setInitialPoolSize(10);
			//最大空閒時間,60秒內未使用則鏈接被丟棄。若爲0則永不丟棄。Default: 0
			cpds.setMaxIdleTime(60);
			//當鏈接池中的鏈接耗盡的時候c3p0一次同時獲取的鏈接數。Default: 3
			cpds.setAcquireIncrement(5);
			//JDBC的標準參數,用以控制數據源內加載的PreparedStatements數量。但因爲預緩存的statements 屬於單個connection而不是整個鏈接池。因此設置這個參數須要考慮到多方面的因素。 
			//若是maxStatements與maxStatementsPerConnection均爲0,則緩存被關閉。Default: 0 
			cpds.setMaxStatements(0);
			//每60秒檢查全部鏈接池中的空閒鏈接。Default: 0
			cpds.setIdleConnectionTestPeriod(60);
			//定義在從數據庫獲取新鏈接失敗後重復嘗試的次數。Default: 30
			cpds.setAcquireRetryAttempts(30);
			//獲取鏈接失敗將會引發全部等待鏈接池來獲取鏈接的線程拋出異常。可是數據源仍有效 保留,並在下次調用getConnection()的時候繼續嘗試獲取鏈接。若是設爲true,那麼在嘗試 
			//獲取鏈接失敗後該數據源將申明已斷開並永久關閉。Default: false 
			cpds.setBreakAfterAcquireFailure(true);
			//-因性能消耗大請只在須要的時候使用它。若是設爲true那麼在每一個connection提交的 時候都將校驗其有效性。建議使用idleConnectionTestPeriod或automaticTestTable 
			//等方法來提高鏈接測試的性能。Default: false 
			cpds.setTestConnectionOnCheckout(false);
			return cpds;
		}catch(Exception ex){
			ex.printStackTrace();
			return null;
		}
	}
	
	/**
	 * 獲取LocalSessionFactoryBean配置屬性
	 * 方法內設置的屬性值能夠放在參數中,方便動態封裝
	 * @return
	 */
	public Properties getProperties(){
		Properties properties=new Properties();
		properties.setProperty("hibernate.dialect","org.hibernate.dialect.MySQL5Dialect");
		properties.setProperty("hibernate.current_session_context_class","org.springframework.orm.hibernate4.SpringSessionContext");
		properties.setProperty("hibernate.hbm2ddl.auto","update");
		properties.setProperty("hibernate.show_sql","true");
		properties.setProperty("hibernate.format_sql","false");
		properties.setProperty("current_session_context_class","thread");
		properties.setProperty("hibernate.temp.use_jdbc_metadata_defaults","false");
		return properties;
	}
	
	/**
	 * 獲取SessionFactory
	 * @param dataSource 數據源對象
	 * @param properties LocalSessionFactoryBean屬性對象
	 * @return SessionFactory 失敗返回null
	 */
	public SessionFactory getSessionFactory(ComboPooledDataSource dataSource,Properties properties){
		SessionFactory sessionFactory=null;
		try {
			LocalSessionFactoryBean localSessionFactory=new LocalSessionFactoryBean();
			localSessionFactory.setDataSource(dataSource);
			localSessionFactory.setHibernateProperties(properties);
			/**
			 * 下面代碼在設置完localSessionFactory屬性後必須調用!!
			 * 以前就沒有調用致使localSessionFactory.getObject(); 一直返回null
			 */
			localSessionFactory.afterPropertiesSet();
			sessionFactory=localSessionFactory.getObject();
		} catch (IOException e) {
			e.printStackTrace();
		}
		return sessionFactory;
	}
	
	/**
	 * 獲取Connection
	 * 覺得dataSource能夠直接獲取到jdbc的Connection
	 * 因此能夠直接jdbc操做,本例中沒有使用
	 * @param cpds 數據源對象
	 * @return Connection
	 */
	public Connection getConn(ComboPooledDataSource cpds){
		try {
			return cpds.getConnection();
		} catch (SQLException e) {
			e.printStackTrace();
			return null;
		}
	}
	
	public static void main(String[]args) throws IOException{
		MyConfiguration confinguration=new MyConfiguration();
		//獲取c3p0 DataSource
		ComboPooledDataSource dataSource=confinguration.getDataSource();
		//獲取LocalSessionFactoryBean配置屬性
		Properties properties=confinguration.getProperties();
		//獲得sessionFactory
		SessionFactory sessionFactory=confinguration.getSessionFactory(dataSource,properties);
		//獲得Session
		Session session=sessionFactory.openSession();
		//測試sql
		String sql="select date_format(NOW(),'%Y-%m-%d %H:%i:%S') str from dual";
		Query query=session.createSQLQuery(sql).setResultTransformer(Transformers.aliasToBean(Param.class));
		Param param=(Param)query.list().get(0);
		String str=param.getStr();
		System.out.println("str->>"+str);
		
	}
}

console 信息:java

Hibernate: select date_format(NOW(),'%Y-%m-%d %H:%i:%S') str from dualmysql

str->>2015-09-06 12:18:32spring

相關文章
相關標籤/搜索