<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    自由飛翔

    我在仰望,java之上

    統計

    留言簿(2)

    我關注的blog

    閱讀排行榜

    評論排行榜

    轉載:在項目中使用多個數據源-多sessionFactory方案

    適用范圍:適合SSH架構訪問多個數據庫,數據庫的類型和表結構不必相同,且沒有跨庫事務的情況(跨庫事務最好用分布式事務處理)。

    文章來源:http://apps.hi.baidu.com/share/detail/15756344

    實現方式:我們可以在spring的配置文件中配置多個sessionFactory,如:
    <bean id="aDataSource"
       class="org.apache.commons.dbcp.BasicDataSource"
       destroy-method="close">
       <property name="driverClassName">
        <value>${adriver}</value>
       </property>
       <property name="url">
        <value>${aurl}</value>
       </property>
       <property name="username">
        <value>${ausername}</value>
       </property>
       <property name="password">
        <value>${apassword}</value>
       </property>
    </bean>
    <bean id="bDataSource"
       class="org.apache.commons.dbcp.BasicDataSource"
       destroy-method="close">
       <property name="driverClassName">
        <value>${bdriver}</value>
       </property>
       <property name="url">
        <value>${burl}</value>
       </property>
       <property name="username">
        <value>${busername}</value>
       </property>
       <property name="password">
        <value>${bpassword}</value>
       </property>
    </bean>
    <bean id="cDataSource"
       class="org.apache.commons.dbcp.BasicDataSource"
       destroy-method="close">
       <property name="driverClassName">
        <value>${cdriver}</value>
       </property>
       <property name="url">
        <value>${curl}</value>
       </property>
       <property name="username">
        <value>${cusername}</value>
       </property>
       <property name="password">
        <value>${cpassword}</value>
       </property>
    </bean>

     

    <!-- Hibernate SessionFactorys -->
    <bean id="aSessionFactory"
       class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
       <property name="dataSource">
        <ref local="aDataSource" />
       </property>
       <property name="mappingResources">
        <list>
         <value>
          .hbm.xml文件
         </value>
        </list>
       </property>
       <property name="hibernateProperties">
        <props>
         <prop key="hibernate.dialect">
          ${ahibernate.dialect}
         </prop>
         <prop key="hibernate.show_sql">true</prop>
         <prop key="format_sql">true</prop>
        </props>
       </property>
    </bean>

    <bean id="bSessionFactory"
       class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
       <property name="dataSource">
        <ref local="bDataSource" />
       </property>
       <property name="mappingResources">
        <list>
         <value>
          .hbm.xml文件
         </value>
        </list>
       </property>
       <property name="hibernateProperties">
        <props>
         <prop key="hibernate.dialect">
          ${bhibernate.dialect}
         </prop>
         <prop key="hibernate.show_sql">true</prop>
         <prop key="format_sql">true</prop>
        </props>
       </property>
    </bean>

    <bean id="cSessionFactory"
       class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
       <property name="dataSource">
        <ref local="cDataSource" />
       </property>
       <property name="mappingResources">
        <list>
         <value>
           .hbm.xml文件
         </value>
        </list>
       </property>
       <property name="hibernateProperties">
        <props>
         <prop key="hibernate.dialect">
          ${chibernate.dialect}
         </prop>
         <prop key="hibernate.show_sql">true</prop>
         <prop key="format_sql">true</prop>
        </props>
       </property>
    </bean>

    <bean id="sessionFactory" class="com.cintel.dcp.datasource.MultiSessionFactory">
       <property name="sessionFactory"><ref local="aSessionFactory"/></property>
    </bean>
    注意:最后一個com.cintel.dcp.datasource.MultiSessionFactory要自己實現,它實現了SessionFactory接口和ApplicationContext接口,如下:
    package com.cintel.dcp.datasource;

    import java.io.Serializable;
    import java.sql.Connection;
    import java.util.Map;
    import java.util.Set;

    import javax.naming.NamingException;
    import javax.naming.Reference;

    import org.apache.commons.logging.Log;
    import org.apache.commons.logging.LogFactory;
    import org.hibernate.HibernateException;
    import org.hibernate.Interceptor;
    import org.hibernate.SessionFactory;
    import org.hibernate.StatelessSession;
    import org.hibernate.classic.Session;
    import org.hibernate.engine.FilterDefinition;
    import org.hibernate.metadata.ClassMetadata;
    import org.hibernate.metadata.CollectionMetadata;
    import org.hibernate.stat.Statistics;
    import org.springframework.beans.factory.NoSuchBeanDefinitionException;
    import org.springframework.context.ApplicationContext;
    import org.springframework.context.ApplicationContextAware;

    public class MultiSessionFactory implements SessionFactory, ApplicationContextAware {
    private static final long serialVersionUID = 2064557324203496378L;
    private static final Log log = LogFactory.getLog(MultiSessionFactory.class);
    private ApplicationContext applicationContext = null;
    private SessionFactory sessionFactory = null;

    public ApplicationContext getApplicationContext() {
       return applicationContext;
    }

    public void setApplicationContext(ApplicationContext applicationContext) {
       this.applicationContext = applicationContext;
    }

    public SessionFactory getSessionFactory(String sessionFactoryName) {
       log.debug("sessionFactoryName:"+sessionFactoryName);
       try{
        if(sessionFactoryName==null||sessionFactoryName.equals("")){
         return sessionFactory;
        }
        return (SessionFactory)this.getApplicationContext().getBean(sessionFactoryName);
       }catch(NoSuchBeanDefinitionException ex){
        throw new RuntimeException("There is not the sessionFactory <name:"+sessionFactoryName+"> in the applicationContext!");
       }
    }

    public SessionFactory getSessionFactory() {
       String sessionFactoryName = CustomerContextHolder.getCustomerType();
       return getSessionFactory(sessionFactoryName);
    }

    public void setSessionFactory(SessionFactory sessionFactory) {
       this.sessionFactory = sessionFactory;
    }


    /* (non-Javadoc)
    * @see org.hibernate.SessionFactory#close()
    */
    public void close() throws HibernateException {
       getSessionFactory().close();
    }
    /* (non-Javadoc)
    * @see org.hibernate.SessionFactory#evict(java.lang.Class)
    */
    public void evict(Class persistentClass) throws HibernateException {
       getSessionFactory().evict(persistentClass);
    }
    /* (non-Javadoc)
    * @see org.hibernate.SessionFactory#evict(java.lang.Class, java.io.Serializable)
    */
    public void evict(Class persistentClass, Serializable id) throws HibernateException {
       getSessionFactory().evict(persistentClass, id);
    }
    /* (non-Javadoc)
    * @see org.hibernate.SessionFactory#evictCollection(java.lang.String)
    */
    public void evictCollection(String roleName) throws HibernateException {
       getSessionFactory().evictCollection(roleName);
    }
    /* (non-Javadoc)
    * @see org.hibernate.SessionFactory#evictCollection(java.lang.String, java.io.Serializable)
    */
    public void evictCollection(String roleName, Serializable id) throws HibernateException {
       getSessionFactory().evictCollection(roleName, id);
    }
    /* (non-Javadoc)
    * @see org.hibernate.SessionFactory#evictEntity(java.lang.String)
    */
    public void evictEntity(String entityName) throws HibernateException {
       getSessionFactory().evictEntity(entityName);
    }
    /* (non-Javadoc)
    * @see org.hibernate.SessionFactory#evictEntity(java.lang.String, java.io.Serializable)
    */
    public void evictEntity(String entityName, Serializable id) throws HibernateException {
       getSessionFactory().evictEntity(entityName, id);
    }
    /* (non-Javadoc)
    * @see org.hibernate.SessionFactory#evictQueries()
    */
    public void evictQueries() throws HibernateException {
       getSessionFactory().evictQueries();
    }
    /* (non-Javadoc)
    * @see org.hibernate.SessionFactory#evictQueries(java.lang.String)
    */
    public void evictQueries(String cacheRegion) throws HibernateException {
       getSessionFactory().evictQueries(cacheRegion);
    }
    /* (non-Javadoc)
    * @see org.hibernate.SessionFactory#getAllClassMetadata()
    */
    public Map getAllClassMetadata() throws HibernateException {
       return getSessionFactory().getAllClassMetadata();
    }
    /* (non-Javadoc)
    * @see org.hibernate.SessionFactory#getAllCollectionMetadata()
    */
    public Map getAllCollectionMetadata() throws HibernateException {
       return getSessionFactory().getAllCollectionMetadata();
    }
    /* (non-Javadoc)
    * @see org.hibernate.SessionFactory#getClassMetadata(java.lang.Class)
    */
    public ClassMetadata getClassMetadata(Class persistentClass) throws HibernateException {
       return getSessionFactory().getClassMetadata(persistentClass);
    }
    /* (non-Javadoc)
    * @see org.hibernate.SessionFactory#getClassMetadata(java.lang.String)
    */
    public ClassMetadata getClassMetadata(String entityName) throws HibernateException {
       return getSessionFactory().getClassMetadata(entityName);
    }
    /* (non-Javadoc)
    * @see org.hibernate.SessionFactory#getCollectionMetadata(java.lang.String)
    */
    public CollectionMetadata getCollectionMetadata(String roleName) throws HibernateException {
       return getSessionFactory().getCollectionMetadata(roleName);
    }
    /* (non-Javadoc)
    * @see org.hibernate.SessionFactory#getCurrentSession()
    */
    public Session getCurrentSession() throws HibernateException {
       return getSessionFactory().getCurrentSession();
    }
    /* (non-Javadoc)
    * @see org.hibernate.SessionFactory#getDefinedFilterNames()
    */
    public Set getDefinedFilterNames() {
       return getSessionFactory().getDefinedFilterNames();
    }
    /* (non-Javadoc)
    * @see org.hibernate.SessionFactory#getFilterDefinition(java.lang.String)
    */
    public FilterDefinition getFilterDefinition(String filterName) throws HibernateException {
       return getSessionFactory().getFilterDefinition(filterName);
    }
    /* (non-Javadoc)
    * @see org.hibernate.SessionFactory#getStatistics()
    */
    public Statistics getStatistics() {
       return getSessionFactory().getStatistics();
    }
    /* (non-Javadoc)
    * @see org.hibernate.SessionFactory#isClosed()
    */
    public boolean isClosed() {
       return getSessionFactory().isClosed();
    }
    /* (non-Javadoc)
    * @see org.hibernate.SessionFactory#openSession()
    */
    public Session openSession() throws HibernateException {
       return getSessionFactory().openSession();
    }
    /* (non-Javadoc)
    * @see org.hibernate.SessionFactory#openSession(java.sql.Connection)
    */
    public Session openSession(Connection connection) {
       return getSessionFactory().openSession(connection);
    }
    /* (non-Javadoc)
    * @see org.hibernate.SessionFactory#openSession(org.hibernate.Interceptor)
    */
    public Session openSession(Interceptor interceptor) throws HibernateException {
       return getSessionFactory().openSession(interceptor);
    }
    /* (non-Javadoc)
    * @see org.hibernate.SessionFactory#openSession(java.sql.Connection, org.hibernate.Interceptor)
    */
    public Session openSession(Connection connection, Interceptor interceptor) {
       return getSessionFactory().openSession(connection, interceptor);
    }
    /* (non-Javadoc)
    * @see org.hibernate.SessionFactory#openStatelessSession()
    */
    public StatelessSession openStatelessSession() {
       return getSessionFactory().openStatelessSession();
    }
    /* (non-Javadoc)
    * @see org.hibernate.SessionFactory#openStatelessSession(java.sql.Connection)
    */
    public StatelessSession openStatelessSession(Connection connection) {
       return getSessionFactory().openStatelessSession(connection);
    }
    /* (non-Javadoc)
    * @see javax.naming.Referenceable#getReference()
    */
    public Reference getReference() throws NamingException {
       return getSessionFactory().getReference();
    }
    }


    然后我用一個常量類來標識sessionFactory
    public class DynamicDataSourceType {
    public static final String A= "aSessionFactory";
    public static final String B= "bSessionFactory";
    public static final String C= "cSessionFactory";
    }

    最后一個關鍵類:用來存放當前正在使用的sessionFactory
    public class CustomerContextHolder {

    private static final ThreadLocal contextHolder = new ThreadLocal();

    public static void setCustomerType(String customerType) {
       Assert.notNull(customerType, "customerType cannot be null");
       contextHolder.set(customerType);
    }

    public static String getCustomerType() {
       return (String) contextHolder.get();
    }

    public static void clearCustomerType() {
       contextHolder.remove();
    }
    }

    可以在action、service、dao中進行數據庫切換,切換方式:
    CustomerContextHolder.setCustomerType(DynamicDataSourceType.A);

    以上思路來自javaEye論壇的一個高手,在此標識感謝



    Gavin

    posted on 2011-11-14 16:11 GavinMiao 閱讀(856) 評論(0)  編輯  收藏 所屬分類: other

    主站蜘蛛池模板: 最好看的中文字幕2019免费| 亚洲福利视频一区| 五月婷婷在线免费观看| 一级视频免费观看| 亚洲av乱码一区二区三区| 亚洲AV综合色区无码一区爱AV| 国产成人免费ā片在线观看| 麻豆视频免费观看| 久久久久成人精品免费播放动漫| 国产精品亚洲专区在线播放| 亚洲AV无码乱码在线观看代蜜桃 | 亚洲精品国产免费| 最新精品亚洲成a人在线观看| 日韩免费无码一区二区视频| 在线视频观看免费视频18| 在线免费观看你懂的| 永久免费av无码网站yy| 一级毛片试看60分钟免费播放| 亚洲AV无码国产一区二区三区| 91亚洲精品麻豆| 久久久久亚洲AV无码永不| 亚洲成AV人片在| 亚洲国产美女精品久久久久∴| 亚洲精品视频在线看| 免费国产a国产片高清网站| 日韩精品免费电影| 在线观看免费大黄网站| 成人无遮挡毛片免费看| 无人影院手机版在线观看免费| 免费福利网站在线观看| 无码国产精品一区二区免费虚拟VR| 2021在线观看视频精品免费| 一级毛片aaaaaa免费看| 麻豆成人久久精品二区三区免费| 男人的天堂网免费网站| 无码少妇精品一区二区免费动态 | 亚洲自偷自偷图片| 国产AⅤ无码专区亚洲AV| 亚洲午夜久久久影院伊人| 亚洲热线99精品视频| 久久精品国产亚洲AV麻豆不卡|