A. spring mvc 怎麼配置多個庫
場景描述:有多個資料庫,每個資料庫可能分布在不同的mysql instance上面,有多個存儲過程,每個存儲過程可能分布在不同的資料庫中,需要有兩個配置文件。
1. mysql 資料庫映射:
A.driverClassName=com.mysql.jdbc.Driver
A.url=jdbc:mysql://172.20.7.51:3308/blog
A.username=trappuser
A.password=Opera1!
B.driverClassName=com.mysql.jdbc.Driver
B.url=jdbc:mysql://localhost:3306/wedding
B.username=root
B.password=opera
上面定義的A、B為兩個mysql instance的縮寫。
2. 存儲過程與mysql instance的映射關系:
SP_Get_User=A
GetStocks=B
定義兩個模擬存儲過程,第一個資料庫「SP_Get_User「是在資料庫A下面,第二個資料庫」GetStocks「是在資料庫B下面。
3. 建立自定義的sessionFactory
3.1 xml配置的datasource及sessionFactory如下:
<bean class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close" id="dataSource">
<property name="driverClassName" value="${database.driverClassName}"/>
<property name="url" value="${database.url}"/>
<property name="username" value="${database.username}"/>
<property name="password" value="${database.password}"/>
</bean>
<bean id="sessionFactory" class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">
<property name="dataSource" ref="dataSource"/>
<property name="packagesToScan" value="com.xx.assetcommander">
</property>
<property name="hibernateProperties">
<props>
<prop key="hibernate.dialect">org.hibernate.dialect.MySQLDialect</prop>
<prop key="hibernate.show_sql">true</prop>
</props>
</property>
</bean>
此處我們定義的sessionFactory的類型為LocalSessionFactoryBean,它是一個工廠對象,與我們再需要的 SessionFactory不是一回事,我們需要的sessionfactory是org.hibernate.SessionFactory,這個對象可以被第一個sessionFactory的getObject()方法生成。
3.2 由於我們連接的是多個mysql instance, 不方便在xml中配置多個datasource和多個sessionFactory,故可以通過純java的形式開發,可以使用map來存儲存儲過程與mysql database的關系,將存儲過程的名字和資料庫建議關系,這樣通過存儲過程的名稱就能得到資料庫的縮寫名,通過資料庫的縮寫名能夠找到對應的mysql instance,使用純java開發的過程類似於xml配置,如下:
ds.setDriverClassName(getDriver());
ds.setUrl(getUrl());
ds.setUsername(getUsername());
ds.setPassword(getPassword());
LocalSessionFactoryBean sessionFactory = new LocalSessionFactoryBean();
sessionFactory.setDataSource(ds);
sessionFactory.setPackagesToScan("com.xx.assetcommander");
Properties params = new Properties();
params.setProperty("hibernate.dialect",
"org.hibernate.dialect.MySQLDialect");
params.setProperty("hibernate.show_sql", "true");
sessionFactory.setHibernateProperties(params);
當我們獲得可以使用的LocalSessionFactoryBean時候,在調用getObject()獲得SessionFactory之前,必須要調用afterPropertiesSet()方法,否則得到的sessionFactory為空。
public Session getDsBySp(String spName) throws IOException {
//get the corresponding mysql database shortname by sp name
String dbName = getDbForSP(str);
//get the corresponding mysql instance connection by mysql database shortname
LocalSessionFactoryBean fB = getDsByDb(dbName);
// don't forget this line or null will be returned when you call getObject() method.
fB.afterPropertiesSet();
return fB.getObject().openSession();
}
註:在tomcat啟動時,如果沒有配置任何datasource,會出現如下錯誤:
org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type [javax.persistence.EntityManagerFactory] is defined
故需要配置默認的datasource.
這種方式需要做到不同的資料庫instance直接業務的完全獨立,不可以出現跨資料庫的表join,否則處理難度會增加。
還有就是對於多資料庫直接的事務管理如何去處理?
B. 連接兩個資料庫 spring配置文件怎麼配置
配置多個數據源信息,比如dataSource1, dataSource2, dataSource3等等。 自定義一個動態數據源類,同時注入以上這些數據源以及相應的標志,一般用Map區分 利用動態數據源類來拿到相應的數據源操作
C. springboot 中druid怎麼連接多個資料庫
spring動態配置多數據源,即在大型應用中對數據進行切分,並且採用多個資料庫實例進行管理,這樣可以有效提高系統的水平伸縮性。
而這樣的方案就會不同於常見的單一數據實例的方案,這就要程序在運行時根據當時的請求及系統狀態來動態的決定將數據存儲在哪個資料庫實例中,以及從哪個資料庫提取數據。
D. 如何在spring框架中解決多數據源的問題
我們的項目需要連接多個資料庫,而且不同的客戶在每次訪問中根據需要會去訪問不同的資料庫。我們以往 在 spring 和 hibernate 框架中總是配置一個數據源在 我們的項目中遇到這樣一個問題:如何讓 sessionFactory 在執 行數據持久化的時候,更准確說是實例變數, sessionFactory 在整個項目中只有一 個對象.springframework,通過它來動態切換數據源 。同時在配置文件中將sessionFactory的dataSource屬性由原來的某個具體的dataSource改為MultiDataSource,根據客戶的需求能夠動態切換不同的數據源,同時,我們又希望使用 dataSource 的 sessionFactory 根本就感覺不到這樣的變 化。 Decorator 模式就正是解決這個問題的設計模式。
首先寫一個 Decorator 類,我取名叫 MultiDataSource.commons。當我們使用 Decorator 的時候與原類完全一樣,當 Decorator 的某些功能卻已經修改為了我們需要修改的功 能。如圖:
E. Spring中如何配置多個資料庫連接
<!-- 數據源配置,使用應用內的DBCP資料庫連接池 -->
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
<!-- Connection Info -->
<property name="driverClassName" value="${jdbc.driver}" />
<property name="url" value="${jdbc.url}" />
<property name="username" value="${jdbc.username}" />
<property name="password" value="${jdbc.password}" />
<!-- Connection Pooling Info -->
<property name="maxIdle" value="${dbcp.maxIdle}" />
<property name="maxActive" value="${dbcp.maxActive}" />
<property name="defaultAutoCommit" value="false" />
<property name="timeBetweenEvictionRunsMillis" value="3600000" />
<property name="minEvictableIdleTimeMillis" value="3600000" />
</bean>
然後 寫個application.properties文件
配置多個資料庫的jdbc.driver.....等等
F. 如何用連接池,Hibernate,Spring連多個SQL資料庫
1:在proxool-conf.xml中配置兩個資料庫連接池
<proxool>
<alias>dataSource_ksmaeaII</alias>
<driver-url>jdbc:jtds:sqlserver://192.10.110.192:1433;databaseName=ksmaeaII</driver-url>
<driver-class>net.sourceforge.jtds.jdbc.Driver</driver-class>
<driver-properties>
<property name="user" value="sa" />
<property name="password" value="" />
</driver-properties>
<maximum-new-connections>100</maximum-new-connections>
<prototype-count>1</prototype-count>
<maximum-connection-count>400</maximum-connection-count>
<minimum-connection-count>20</minimum-connection-count>
<house-keeping-test-sql>select getdate()</house-keeping-test-sql>
</proxool>
<proxool>
<alias>ds1</alias>
<driver-url>jdbc:jtds:sqlserver://192.10.110.192:1433;databaseName=ksmaeaIIdbmove</driver-url>
<driver-class>net.sourceforge.jtds.jdbc.Driver</driver-class>
<driver-properties>
<property name="user" value="sa" />
<property name="password" value="" />
</driver-properties>
<maximum-new-connections>100</maximum-new-connections>
<prototype-count>1</prototype-count>
<maximum-connection-count>400</maximum-connection-count>
<minimum-connection-count>20</minimum-connection-count>
<house-keeping-test-sql>select getdate()</house-keeping-test-sql>
</proxool>
2:要連幾個庫就配置幾個hibernate.cfg.xml,下面我配置兩個資料庫為例
創建hibernate.cfg.xml:裡面寫第一個資料庫的映射文件(本地資料庫),如<mapping
resource="com/wisoft/datachange/data/hibernate//SbInfApply.hbm.xml" />
創建hibernate.cfg1.xml:裡面寫第二個資料庫的映射文件(前置庫,別人的資料庫),如<mapping
resource="com/wisoft/datachange/data/hibernate//InfApply.hbm.xml" />
3:創建一個類,繼承HibernateDaoSupport。(直接拷過去就能直接用,我的第二個資料庫就是用了這裡面的factory1,第一個資料庫用了Hibernate原來的factory,如果要連多個庫,則多創建幾個factory)
package com.wisoft.datachange.data;
import org.hibernate.SessionFactory;
import org.springframework.orm.hibernate3.HibernateTemplate;
import org.springframework.orm.hibernate3.support.HibernateDaoSupport;
public class DebugBean extends HibernateDaoSupport {
private SessionFactory factory1;
// private SessionFactory factory2;
protected HibernateTemplate hibernateTemplate1;
// protected HibernateTemplate hibernateTemplate2;
public void setFactory1(SessionFactory factory1) {
this.factory1 = factory1;
}
// public void setFactory2(SessionFactory factory2) {
// this.factory2 = factory2;
// }
public SessionFactory getFactory1() {
return factory1;
}
// public SessionFactory getFactory2() {
// return factory2;
// }
protected HibernateTemplate createHibernateTemplate(SessionFactory sessionFactory) {
return super.createHibernateTemplate(sessionFactory);
}
protected void initDao() throws Exception {
hibernateTemplate1 = super.createHibernateTemplate(factory1);
// hibernateTemplate2 = super.createHibernateTemplate(factory2);
super.initDao();
}
}
4:編寫自己的測試BO:在BO里注入DAO,如下
public class InfApplyBO implements IInfApplyBO {
private IInfApplyDAO myInfApplyDAO;
public IInfApplyDAO getMyInfApplyDAO() {
return myInfApplyDAO;
}
public void setMyInfApplyDAO(IInfApplyDAO myInfApplyDAO) {
this.myInfApplyDAO = myInfApplyDAO;
}
//底下編寫自己的業務代碼
//用this.myInfApplyDAO直接調用Dao層的方法,由DAO對資料庫進行操作
}
5:編寫自己的測試DAO:繼承DebugBean如下
public class MyInfApplyDAO extends DebugBean implements IInfApplyDAO {
//對資料庫的操作均可寫在這里,可以直接用模版save
//如要對第一個資料庫操作,只需this.getHibernateTemplate().find(hql);
//如要對第二個資料庫操作,只需hibernateTemplate1.save(obj);就行
//注意:在對資料庫操作之前不要忘了寫applicationContext.xml的配置文件,看第6步
}
6:寫applicationContext.xml的配置文件
<!--對第一個資料庫連接池的配置-->
<bean id="dataSource_ksmaeaII" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="driverClassName">
<value>org.logicalcobwebs.proxool.ProxoolDriver</value>
</property>
<property name="url">
<value>proxool.dataSource_ksmaeaII</value>
</property>
</bean>
<bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
<property name="dataSource">
<ref bean="dataSource_ksmaeaII" />
</property>
<property name="lobHandler" ref="lobHandler" />
<property name="configLocation">
<value>classpath:hibernate.cfg.xml</value>
</property>
<property name="hibernateProperties">
<props>
<prop key="hibernate.dialect">org.hibernate.dialect.SQLServerDialect</prop>
<prop key="hibernate.show_sql">true</prop>
<prop key="hibernate.AllowCreate">true</prop>
<prop key="hibernate.connection.release_mode">auto</prop>
<prop key="hibernate.default_schema">dbo</prop>
</props>
</property>
</bean>
<!--對第二個資料庫連接池的配置-->
<bean id="ds1" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="driverClassName">
<value>org.logicalcobwebs.proxool.ProxoolDriver</value>
</property>
<property name="url">
<value>proxool.ds1</value>
</property>
</bean>
<bean id="sessionFactory1" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
<property name="dataSource">
<ref bean="ds1" />
</property>
<property name="lobHandler" ref="lobHandler" />
<property name="configLocation">
<value>classpath:hibernate1.cfg.xml</value>
</property>
<property name="hibernateProperties">
<props>
<prop key="hibernate.dialect">org.hibernate.dialect.SQLServerDialect</prop>
<prop key="hibernate.show_sql">true</prop>
<prop key="hibernate.AllowCreate">true</prop>
</props>
</property>
</bean>
<!--配置事務-->
<bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager">
<property name="sessionFactory">
<ref local="sessionFactory" />
</property>
</bean>
<bean id="transactionManager1" class="org.springframework.orm.hibernate3.HibernateTransactionManager">
<property name="sessionFactory">
<ref bean="sessionFactory1"/>
</property>
</bean>
<!--工廠模版-->
<bean id="hibernateTemplate" class="org.springframework.orm.hibernate3.HibernateTemplate">
<property name="sessionFactory" ref="sessionFactory" />
</bean>
<bean id="txProxyTemplate" abstract="true" class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">
<property name="transactionManager" ref="transactionManager" />
<property name="transactionAttributes">
<props>
<prop key="get*">PROPAGATION_REQUIRED,readOnly</prop>
<prop key="find*">PROPAGATION_REQUIRED,readOnly</prop>
<prop key="save*">PROPAGATION_REQUIRED</prop>
<prop key="write">PROPAGATION_REQUIRED,readOnly</prop>
<prop key="makeWorkNoOfDep">PROPAGATION_REQUIRED</prop>
</props>
</property>
</bean>
<bean id="nativeJdbcExtractor" class="org.springframework.jdbc.support.nativejdbc." lazy-init="true" />
<bean id="lobHandler" class="org.springframework.jdbc.support.lob.DefaultLobHandler">
<!-- <property name="nativeJdbcExtractor">
<ref bean="nativeJdbcExtractor" />
</property> -->
</bean>
<bean id="debugbean" class="com.wisoft.datachange.data.DebugBean" abstract="true">
<property name="sessionFactory" ref="sessionFactory" />
<property name="factory1" ref="sessionFactory1" />
<!-- <property name="factory2" ref="sessionFactory2" />-->
</bean>
<bean id="myInfApplyDAO"
class="com.wisoft.datachange.data.hibernate.MyInfApplyDAO" parent="debugbean" >
</bean>
<bean id="InfApplyBO" parent="txProxyTemplate">
<property name="target">
<bean class="com.wisoft.datachange.bo.impl.InfApplyBO">
<property name="myInfApplyDAO" ref="myInfApplyDAO" />
</bean>
</property>
</bean>
到此,資料庫就連起來啦\(^o^)/~
G. 在spring文件中如何配置連接多個資料庫,如下是已經配置了一個資料庫,如何加另外的資料庫
..一般我是
吧xml
配置文件
不同
功能
配在
不同的
xml文件
裡面。這樣看的清楚寫。用哪個就在
xml文件裡面
調用另外的xml文件就可以了。
H. 怎麼在一個spring裡面配置多個資料庫連接池
gitchat學術分享,動態數據源,附帶源碼