spring多個資料庫
❶ spring能不能對多個資料庫進行事務管理
可以,Spring的事務處理能力是最綜合完整的,對編程式、聲明式均進行了支持,而且可以在不使用應用伺服器的情況下兼容應用伺服器事務。下面的是一個分布式的聲明事務,訪問多個數據源的配置:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd">
<beans default-autowire="byName">
<!-- Configurer that replaces ${...} placeholders with values from a properties
file -->
<!-- (in this case, JDBC-related settings for the dataSource definition
below) -->
<bean id="propertyConfigurer"
class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
<property name="locations">
<list>
<value>classpath*:spring/jdbc.properties</value>
</list>
</property>
</bean>
<bean id="dataSourceMysql" class="com.atomikos.jdbc.AtomikosDataSourceBean"
init-method="init" destroy-method="close">
<property name="uniqueResourceName" value="${mysql.uniqueResourceName}" />
<property name="xaDataSourceClassName" value="${mysql.xaDataSourceClassName}" />
<property name="xaProperties">
<props>
<prop key="user">${mysql.user}</prop>
<prop key="password">${mysql.password}</prop>
<prop key="URL">${mysql.url}</prop>
</props>
</property>
<property name="poolSize" value="${mysql.poolSize}" />
</bean>
<bean id="dataSourceOracle" class="com.atomikos.jdbc.AtomikosDataSourceBean"
init-method="init" destroy-method="close">
<property name="uniqueResourceName" value="${oracle.uniqueResourceName}" />
<property name="xaDataSourceClassName" value="${oracle.xaDataSourceClassName}" />
<property name="xaProperties">
<props>
<prop key="user">${oracle.user}</prop>
<prop key="password">${oracle.password}</prop>
<prop key="URL">${oracle.url}</prop>
</props>
</property>
<property name="poolSize" value="${oracle.poolSize}" />
</bean>
<!-- Construct Atomikos UserTransactionManager, needed to configure Spring -->
<bean id="atomikosTransactionManager" class="com.atomikos.icatch.jta.UserTransactionManager"
init-method="init" destroy-method="close">
<!-- when close is called, should we force transactions to terminate or
not? -->
<property name="forceShutdown" value="${transactionManager.forceShutdown}" />
</bean>
<!-- Also use Atomikos UserTransactionImp, needed to configure Spring -->
<bean id="atomikosUserTransaction" class="com.atomikos.icatch.jta.UserTransactionImp">
<property name="transactionTimeout" value="${transactionManager.transactionTimeout}" />
</bean>
<!-- Configure the Spring framework to use JTA transactions from Atomikos -->
<bean id="transactionManager"
class="org.springframework.transaction.jta.JtaTransactionManager">
<property name="transactionManager">
<ref bean="atomikosTransactionManager" />
</property>
<property name="userTransaction">
<ref bean="atomikosUserTransaction" />
</property>
</bean>
<bean id="txManager"
class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean"
abstract="true">
<property name="transactionManager">
<ref bean="transactionManager" />
</property>
<property name="transactionAttributes">
<props>
<prop key="save*">PROPAGATION_REQUIRED, +AuaException</prop>
</props>
</property>
</bean>
<bean id="studentOracleDao" class="com.aua..oracle.StudentDao" />
<bean id="studentMysqlDao" class="com.aua..mysql.StudentDao" />
<bean id="studentService" parent="txManager">
<property name="target">
<bean class="com.aua.service.impl.StudentService" />
</property>
</bean>
</beans>
❷ 在spring文件中如何配置連接多個資料庫,如下是已經配置了一個資料庫,如何加另外的資料庫
..一般我是
吧xml
配置文件
不同
功能
配在
不同的
xml文件
裡面。這樣看的清楚寫。用哪個就在
xml文件裡面
調用另外的xml文件就可以了。
❸ Spring中如何配置多個資料庫連接
1.解決方案:
property name="<.commons; value=" value="close".properties文件
2.配置多個資料庫:
jdbc;minEvictableIdleTimeMillis"driverClassName".maxActive}" /
password}".url}"${jdbc;>.driver;3600000"maxActive";>${jdbc.driver}"
/username"${dbcp;
</ value=".dbcp;url".BasicDataSource"
< value="bean id=".username}"
< value="
<>password"${dbcp;org.;dataSource"false" /
<property name=" destroy-method="3600000"
application;property name=" class=",property name="
< value=">.apache; value=" /property name=">
<${jdbc;property name="property name=">.;
❹ springjdbc連接多個資料庫誰有比較好的解決方法
jdbc和連接池對於你這個場景來說,都足夠,既然用spring管理了,建議還是使用連接池,另外,spring自身沒有實現連接池,一般都是對第三方連接池的包裝,常見的有C3P0,dbcp以及最近比較流行的boneCP等,這幾個配置都差不多太多,以boneCP為例:
<bean id="dataSource" class="com.jolbox.bonecp.BoneCPDataSource"
destroy-method="close">
<property name="driverClass" value="${jdbc.driverClass}" />
<property name="jdbcUrl" value="${jdbc.url}" />
<property name="username" value="${jdbc.user}" />
<property name="password" value="${jdbc.password}" />
<property name="idleConnectionTestPeriod" value="60" />
<property name="idleMaxAge" value="240" />
<property name="maxConnectionsPerPartition" value="30" />
<property name="minConnectionsPerPartition" value="10" />
<property name="partitionCount" value="2" />
<property name="acquireIncrement" value="5" />
<property name="statementsCacheSize" value="100" />
<property name="releaseHelperThreads" value="3" />
</bean>
<bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
<property name="dataSource" ref="dataSource" />
</bean>
使用jdbcTemplate做你的數據操作即可,jdbcTemplate是spring對jdbc的封裝,很實用,也很簡單,樓主可以了解下。
❺ 怎麼在一個spring裡面配置多個資料庫連接池
gitchat學術分享,動態數據源,附帶源碼
❻ springboot 中druid怎麼連接多個資料庫
spring動態配置多數據源,即在大型應用中對數據進行切分,並且採用多個資料庫實例進行管理,這樣可以有效提高系統的水平伸縮性。
而這樣的方案就會不同於常見的單一數據實例的方案,這就要程序在運行時根據當時的請求及系統狀態來動態的決定將數據存儲在哪個資料庫實例中,以及從哪個資料庫提取數據。
❼ spring boot怎麼連接多種資料庫
新建Spring Boot項目,依賴選擇JPA(spring-boot-starter-data-jpa)和Web(spring-bootstarter-web)。
配置基本屬性 在application.properties里配置數據源和jpa的相關屬性
spring.datasource.driverClassName=com.mysql.jdbc.Driver
spring.datasource.url=jdbc:mysql://localhost:3306/springboot
spring.datasource.username=root
spring.datasource.password=123456
spring.jpa.hibernate.ddl-auto=update
spring.jpa.show-sql=true
spring.jackson.serialization.indent_output=true
定義映射實體類
定義Controller類
@RestControllerpublic class PersonCtroller {
@Autowired PersonServer personServer;
@RequestMapping("/rollback")
public Person rollback(Person person){
return personServer.savePersonWithRollBack(person);
}
@RequestMapping("/norollback")
public Person noRollback(Person person){
return personServer.savePersonWithOutRollBack(person);
}
}
定義數據訪問層
public interface PersonRepository extends JpaRepository<Person, Long> {}
定義Server層
@Servicepublic class PersonServerImp implements PersonServer {
@Autowired
PersonRepository personRepository;
@Transactional(rollbackFor = {IllegalArgumentException.class})
@Override
public Person savePersonWithRollBack(Person person) {
Person p = personRepository.save(person);
if (p.getName().equals("xxx")){
throw new IllegalArgumentException("用戶已存在,數據會回滾");
}
return p;
}
}
7
瀏覽器訪問
❽ 如何在spring框架中解決多數據源的問題
我們的項目需要連接多個資料庫,而且不同的客戶在每次訪問中根據需要會去訪問不同的資料庫。我們以往 在 spring 和 hibernate 框架中總是配置一個數據源在 我們的項目中遇到這樣一個問題:如何讓 sessionFactory 在執 行數據持久化的時候,更准確說是實例變數, sessionFactory 在整個項目中只有一 個對象.springframework,通過它來動態切換數據源 。同時在配置文件中將sessionFactory的dataSource屬性由原來的某個具體的dataSource改為MultiDataSource,根據客戶的需求能夠動態切換不同的數據源,同時,我們又希望使用 dataSource 的 sessionFactory 根本就感覺不到這樣的變 化。 Decorator 模式就正是解決這個問題的設計模式。
首先寫一個 Decorator 類,我取名叫 MultiDataSource.commons。當我們使用 Decorator 的時候與原類完全一樣,當 Decorator 的某些功能卻已經修改為了我們需要修改的功 能。如圖:
❾ 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,否則處理難度會增加。
還有就是對於多資料庫直接的事務管理如何去處理?
❿ Spring怎樣高效的配置多套數據源
1、首先配置多個datasource
<!-- 主資料庫的數據據源 -->
<bean id="masterDataSource" class="org.apache.commons.dbcp.BasicDataSource"
destroy-method="close">
<property name="driverClassName" value="oracle.jdbc.OracleDriver" />
<property name="url" value="jdbc:oracle:thin:@192.168.10.11:1521:trew" />
<property name="username" value="poi" />
<property name="password" value="poi" />
</bean>
<!-- 備份庫的數據據源 -->
<bean id="slaveDataSource" class="org.apache.commons.dbcp.BasicDataSource"
destroy-method="close">
<property name="driverClassName" value="oracle.jdbc.OracleDriver" />
<property name="url" value="jdbc:oracle:thin:@192.168.10.12:1521:trew" />
<property name="username" value="poi2" />
<property name="password" value="poi2" />
</bean>
2、寫一個DynamicDataSource類繼承AbstractRoutingDataSource,並實現determineCurrentLookupKey方法
?
public class DynamicDataSource extends AbstractRoutingDataSource {
@SuppressWarnings("unused")
private Log logger = LogFactory.getLog(getClass());
@Override
protected Object determineCurrentLookupKey() {
return DbContextHolder.getDbType();
}
}
public class DbContextHolder {
@SuppressWarnings("rawtypes")
private static final ThreadLocal contextHolder = new ThreadLocal();
@SuppressWarnings("unchecked")
public static void setDbType(String dbType) {
contextHolder.set(dbType);
}
public static String getDbType() {
return (String) contextHolder.get();
}
public static void clearDbType() {
contextHolder.remove();
}
}
3. 配置動態數據源
<!--將DynamicDataSource Bean加入到Spring的上下文xml配置文件中去,同時配置DynamicDataSource的targetDataSources(多數據源目標)屬性的Map映射。-->
<bean id="dataSource" class="cn.com.core.datasource.DynamicDataSource">
<property name="targetDataSources">
<map key-type="java.lang.String">
<entry key="masterDataSource" value-ref="masterDataSource" />
<entry key="slaveDataSource" value-ref="slaveDataSource" />
</map>
</property>
<property name="defaultTargetDataSource" ref="masterDataSource"/>
</bean>
4.使用動態數據源(hibernate)
<bean id="sessionFactory"
class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
<property name="dataSource" ref="dataSource" />
<property name="lobHandler" ref="lobHandler"/>
<property name="eventListeners">
<map>
<entry key="post-insert">
<ref bean="logListener"/>
</entry>
<entry key="post-update">
<ref bean="logListener"/>
</entry>
<entry key="post-delete">
<ref bean="logListener"/>
</entry>
</map>
</property>
<property name="hibernateProperties">
<props>
<prop key="hibernate.dialect">
org.hibernate.dialect.Oracle10gDialect
<!-- org.hibernate.dialect.OracleDerbyDialect -->
</prop>
<prop key="hibernate.show_sql">true</prop>
<!-- <prop key="hibernate.generate_statistics">true</prop> -->
<prop key="hibernate.connection.release_mode">
auto
</prop>
<prop key="hibernate.autoReconnect">true</prop>
<!--
<prop key="hibernate.hbm2ddl.auto">update</prop>
-->
<prop key="hibernate.cache.use_second_level_cache">false</prop>
<prop key="hibernate.cache.provider_class">
org.hibernate.cache.EhCacheProvider
</prop>
<prop key="hibernate.cache.use_query_cache">false</prop>
</props>
</property>
</bean>
使用Hibernate時的事務管理配置示例:
<bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager">
< property name="sessionFactory" ref="sessionFactory" />
bean>