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

相关文章
相关标签/搜索