Spring+Hibernate配置多資料來源
配置說明
在實際應用中,經常會用到讀寫分離,這裡就這種情況進行Spring+Hibernate的多資料來源配置。此處的配置只是讓讀的方法操作一個數據庫,寫的方法操作另外一個數據庫。
注:我這裡的配置JDBC連線是放在properties檔案中的,當然你也可以直接寫在ApplicationCpntext.xml檔案中或其他的配置方式。
配置步驟
1、配置多資料庫
在jdbc.Properties中,配置兩個資料庫的連線。在此處的例子如下(我這裡都是使用的MySql,如果要使用其他的請更換驅動):
[java] view plain copy print?
- ## MySQL local
- jdbc.driverClassName=com.mysql.jdbc.Driver
- jdbc.url= jdbc:mysql://localhost:3306/資料庫名?createDatabaseIfNotExist=true&useUnicode=true&characterEncoding=utf-8&zeroDateTimeBehavior=convertToNull
- jdbc.username=root
- jdbc.password=root
- ## MySql Server
- jdbc_t.driverClassName=com.mysql.jdbc.Driver
- jdbc_t.url= jdbc:mysql://伺服器Ip:3306/資料庫名(可以和上面不一樣的)?createDatabaseIfNotExist=true&useUnicode=true&characterEncoding=utf-8&zeroDateTimeBehavior=convertToNull
- jdbc_t.username=root
- jdbc_t.password= root
## MySQL local jdbc.driverClassName=com.mysql.jdbc.Driver jdbc.url= jdbc:mysql://localhost:3306/æ°æ®åºå?createDatabaseIfNotExist=true&useUnicode=true&characterEncoding=utf-8&zeroDateTimeBehavior=convertToNull jdbc.username=root jdbc.password=root ## MySql Server jdbc_t.driverClassName=com.mysql.jdbc.Driver jdbc_t.url= jdbc:mysql://æå¡å¨Ip:3306/æ°æ®åºåï¼å¯ä»¥åä¸é¢ä¸ä¸æ ·çï¼?createDatabaseIfNotExist=true&useUnicode=true&characterEncoding=utf-8&zeroDateTimeBehavior=convertToNull jdbc_t.username=root jdbc_t.password= root
注:jdbc.driverClassName和jdbc_t.driverClassName都可以使用jdbc.driverClassName的,如果使用一個則在後面的ApplicationContext.xml中配置一樣的就可以了,這裡為了方便說明,分開寫。同理,如果使用者名稱和密碼都一樣,也可以只用一個配置就可以了。
2、配置DataSource
這裡使用的是DBCP連線池。
[xhtml] view plain copy print?
- <!-- 使用DBCP資料庫連線池進行資料來源的配置 -->
- <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
- <property name="driverClassName" value="${jdbc.driverClassName}"/>
- <property name="url" value="${jdbc.url}"/>
- <property name="username" value="${jdbc.username}"/>
- <property name="password" value="${jdbc.password}"/>
- <property name="maxActive" value="100"/>
- <property name="maxWait" value="1000"/>
- <property name="poolPreparedStatements" value="true"/>
- <property name="defaultAutoCommit" value="true"/>
- <property name="removeAbandoned" value="true"/>
- <property name="logAbandoned" value="true"/>
- <property name="minEvictableIdleTimeMillis" value="10"/>
- <property name="removeAbandonedTimeout" value="5"/>
- </bean>
- <bean id="dataSource_t" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
- <property name="driverClassName" value="${jdbc_t.driverClassName}"/>
- <property name="url" value="${jdbc_t.url}"/>
- <property name="username" value="${jdbc_t.username}"/>
- <property name="password" value="${jdbc_t.password}"/>
- <property name="maxActive" value="100"/>
- <property name="maxWait" value="1000"/>
- <property name="poolPreparedStatements" value="true"/>
- <property name="defaultAutoCommit" value="true"/>
- <property name="removeAbandoned" value="true"/>
- <property name="logAbandoned" value="true"/>
- <property name="minEvictableIdleTimeMillis" value="10"/>
- <property name="removeAbandonedTimeout" value="5"/>
- </bean>
<!-- 使ç¨DBCPæ°æ®åºè¿æ¥æ± è¿è¡æ°æ®æºçéç½® --> <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close"> <property name="driverClassName" value="${jdbc.driverClassName}"/> <property name="url" value="${jdbc.url}"/> <property name="username" value="${jdbc.username}"/> <property name="password" value="${jdbc.password}"/> <property name="maxActive" value="100"/> <property name="maxWait" value="1000"/> <property name="poolPreparedStatements" value="true"/> <property name="defaultAutoCommit" value="true"/> <property name="removeAbandoned" value="true"/> <property name="logAbandoned" value="true"/> <property name="minEvictableIdleTimeMillis" value="10"/> <property name="removeAbandonedTimeout" value="5"/> </bean> <bean id="dataSource_t" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close"> <property name="driverClassName" value="${jdbc_t.driverClassName}"/> <property name="url" value="${jdbc_t.url}"/> <property name="username" value="${jdbc_t.username}"/> <property name="password" value="${jdbc_t.password}"/> <property name="maxActive" value="100"/> <property name="maxWait" value="1000"/> <property name="poolPreparedStatements" value="true"/> <property name="defaultAutoCommit" value="true"/> <property name="removeAbandoned" value="true"/> <property name="logAbandoned" value="true"/> <property name="minEvictableIdleTimeMillis" value="10"/> <property name="removeAbandonedTimeout" value="5"/> </bean>
注:id不能重複,所以後面的使用了dataSource_t和dataSource以區別,這樣才能區分使用的是那一個數據庫。如果上面的driverClassName配置一樣,你可以不用配置jdbc_t.driverClassName,都用jdbc.driverClassName即可。
3、配置sessionFactory
請注意標紅加粗的地方:
[xhtml] view plain copy print?
- <bean id="sessionFactory" class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean">
- <property name="dataSource" ref="dataSource"/>
- <property name="configLocations">
- <list>
- <value>classpath:hibernate.cfg.xml</value>
- </list>
- </property>
- <bean id="sessionFactory_t" class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean">
- <property name="dataSource" ref="dataSource_t"/>
- <property name="configLocations">
- <list>
- <value>classpath: hibernate_t.cfg.xml</value>
- </list>
- </property>
<bean id="sessionFactory" class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean"> <property name="dataSource" ref="dataSource"/> <property name="configLocations"> <list> <value>classpath:hibernate.cfg.xml</value> </list> </property> <bean id="sessionFactory_t" class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean"> <property name="dataSource" ref="dataSource_t"/> <property name="configLocations"> <list> <value>classpath: hibernate_t.cfg.xml</value> </list> </property>
注:hibernate.cfg.xml和hibernate_t.cfg.xml可以根據實際情況看看是否應該區別開。也可以共用一份。
4、配置DAO
在需要使用本地的資料庫的時候(對於你的專案,不一定是本地),就如下配置:
<property name="sessionFactory" ref="sessionFactory" />
需要使用伺服器的資料庫時,如下配置:
<property name="sessionFactory" ref="sessionFactory_t" />
當然你也可以配置多個,根據需要多加配置即可。