spring boot 1.5.4 다 중 데이터 원본 설정 문제 해결
10955 단어 springboot다 중 데이터 원본배치 하 다.
1.먼저 데이터 원본 설정 정의
#=====================multiple database config============================
#ds1
first.datasource.url=jdbc:mysql://localhost/test?characterEncoding=utf8&useSSL=true
first.datasource.username=root
first.datasource.password=123456
first.datasource.driver-class-name=com.mysql.jdbc.Driver
first.datasource.type=org.apache.tomcat.jdbc.pool.DataSource
first.datasource.max-wait=10000
first.datasource.max-active=200
first.datasource.test-on-borrow=true
first.datasource.initial-size=10
#ds2
second.datasource.url=jdbc:mysql://localhost/test2?characterEncoding=utf8&useSSL=true
second.datasource.username=root
second.datasource.password=123456
second.datasource.driver-class-name=com.mysql.jdbc.Driver
second.datasource.type=org.apache.tomcat.jdbc.pool.DataSource
second.datasource.max-wait=10000
second.datasource.max-active=200
second.datasource.test-on-borrow=true
second.datasource.initial-size=10
#=====================jpa config================================
# :update/create/create-drop/validate/none
spring.jpa.hibernate.ddl-auto=none
# sql
spring.jpa.show-sql=true
# json
spring.jackson.serialization.indent_output=true
2.ds1 의 주입 대상 설정 및 jpa 지원 사용
/**
* Created by hdwang on 2017-06-16.
*
* If you are using Spring Data, you need to configure @EnableJpaRepositories
*/
@Configuration
@EnableTransactionManagement
@EnableJpaRepositories(basePackages = "com.hdwang.dao.datajpa.firstDs",entityManagerFactoryRef = "firstEntityManagerFactory",transactionManagerRef="firstTransactionManager")
public class FirstDsConfig {
/**
*
* Primary ,Autowire ,
* @return
*/
@Bean
@Primary
@ConfigurationProperties("first.datasource")
public DataSourceProperties firstDataSourceProperties() {
return new DataSourceProperties();
}
/**
*
* @return
*/
@Bean
@Primary
@ConfigurationProperties("first.datasource")
public DataSource firstDataSource() {
return firstDataSourceProperties().initializeDataSourceBuilder().build();
}
/**
*
* @param builder spring , type ( @Primary ), name
* @return
*/
@Bean
@Primary
public LocalContainerEntityManagerFactoryBean firstEntityManagerFactory(
EntityManagerFactoryBuilder builder) {
return builder
.dataSource(firstDataSource())
.packages("com.hdwang.entity.dbFirst")
.persistenceUnit("firstDs")
.build();
}
/**
*
* @return
*/
@Bean(name = "firstTransactionManager")
@Primary
public PlatformTransactionManager transactionManager(EntityManagerFactory emf){
JpaTransactionManager transactionManager = new JpaTransactionManager();
transactionManager.setEntityManagerFactory(emf);
return transactionManager;
}
@Bean
@Primary
public JdbcTemplate jdbcTemplate(){
return new JdbcTemplate(firstDataSource());
}
@Bean
@Primary
public TransactionTemplate transactionTemplate(PlatformTransactionManager platformTransactionManager){
return new TransactionTemplate(platformTransactionManager);
}
}
관련 지식 포인트:1.@Bean 을 사용 하면 bean 대상 을 만들어 spring 용기 관리 에 맡 길 수 있 습 니 다.
2.@Bean 이 만 든 bean 대상 의 이름 은 기본적으로 방법 이름 이 고 지정 할 수 있 습 니 다.
3.@Bean 방법 매개 변 수 는 bean 대상 을 받 습 니 다.기본적으로 type 형식 에 따라 주입 대상 을 받 습 니 다.by Name 방식 으로 변경 하려 면@Qualifier 주 해 를 사용 하여 정확 한 대상 을 주입 할 수 있 습 니 다.
4.@Primary 는 이 bean 이 이 유형의 기본 bean 을 표시 합 니 다.다른 곳 에서 인용 할 때@Autowired 를 사용 하면 유형 에 따라 주입 할 수 있 으 며 같은 유형의 여러 대상 의 영향 을 받 지 않 습 니 다.
5.EnableJpa Repositories 는 spring data jpa 의 지원 을 사용 합 니 다.즉,jpa 의 새로운 사용 방식 입 니 다.basePackages 가 가리 키 는 일@Repository 인터페이스 가 있 는 가방 위 치 를 주의 하 십시오.여러 개 를 설정 할 수 있 습 니 다.
다른 주 해 는 잘 모 르 겠 어!
2.ds2 의 주입 대상 설정 및 jpa 지원 사용
@Configuration
@EnableTransactionManagement
@EnableJpaRepositories(basePackages = "com.hdwang.dao.datajpa.secondDs", entityManagerFactoryRef = "secondEntityManagerFactory",transactionManagerRef = "secondTransactionManager")
public class SecondDsConfig {
@Bean
@ConfigurationProperties("second.datasource")
public DataSourceProperties secondDataSourceProperties() {
return new DataSourceProperties();
}
@Bean
@ConfigurationProperties("second.datasource")
public DataSource secondDataSource() {
return secondDataSourceProperties().initializeDataSourceBuilder().build();
}
/**
*
* @param builder spring , type ( @Primary ), name
* @return
*/
@Bean
public LocalContainerEntityManagerFactoryBean secondEntityManagerFactory(
EntityManagerFactoryBuilder builder) {
return builder
.dataSource(secondDataSource())
.packages("com.hdwang.entity.dbSecond")
.persistenceUnit("secondDs")
.build();
}
/**
*
* @param secondEntityManagerFactory ( )
* @return
*/
@Bean(name = "secondTransactionManager")
public PlatformTransactionManager transactionManager(@Qualifier("secondEntityManagerFactory")LocalContainerEntityManagerFactoryBean secondEntityManagerFactory){
JpaTransactionManager transactionManager = new JpaTransactionManager();
transactionManager.setEntityManagerFactory(secondEntityManagerFactory.getObject());
return transactionManager;
}
@Bean(name="jdbcTemplate2")
public JdbcTemplate jdbcTemplate(){
return new JdbcTemplate(secondDataSource());
}
@Bean(name = "transactionTemplate2")
public TransactionTemplate transactionTemplate(@Qualifier("secondTransactionManager")PlatformTransactionManager transactionManager){
return new TransactionTemplate(transactionManager);
}
}
3.Repository 데이터 지구 층
package com.hdwang.dao.datajpa.firstDs;
@Repository
public interface UserRepository extends JpaRepository<User, Integer> {
/**
* spring data jpa ( )
* @return
*/
User findByNumber(String number);
@Modifying
@Query("delete from User u where u.id = :id")
void deleteUser(@Param("id")int id);
}
package com.hdwang.dao.datajpa.secondDs;
@Repository
public interface OrderRepository extends JpaRepository<Order, Integer> {
/**
* spring data jpa ( )
* @return
*/
User findByNumber(String number);
@Modifying
@Query("delete from Order o where o.id = :id")
void deleteUser(@Param("id") int id);
}
위의 두 인 터 페 이 스 는 두 개의 데이터 원본 에 속 합 니 다.@EnableJpa Repositories 가 설정 되면 해당 하 는 데이터 원본 을 정확하게 조작 할 수 있 습 니 다.4.서비스 층,사물 주의(인 터 페 이 스 는 붙 이지 않 겠 습 니 다)
@Service
@Transactional("firstTransactionManager")
public class UserServiceImpl implements UserService {
@Autowired
private UserRepository userRepository;
@Override
public User findById(int id) {
return this.userRepository.findOne(id);
}
@Override
public User findByNumber(String number) {
return this.userRepository.findByNumber(number);
}
@Override
public List<User> findAllUserByPage(int page,int size) {
Pageable pageable = new PageRequest(page, size);
Page<User> users = this.userRepository.findAll(pageable);
return users.getContent();
}
@Override
public User updateUser(User user,boolean throwEx) {
User userNew = this.userRepository.save(user);
if(throwEx){
throw new RuntimeException("throw a ex");
}
return userNew;
}
@Override
public void deleteUser(int id) {
this.userRepository.deleteUser(id);
}
}
@Service
@Transactional("secondTransactionManager")
public class OrderServiceImpl implements OrderService {
@Autowired
private OrderRepository orderRepository;
@Override
public Order findById(int id) {
return this.orderRepository.findOne(id);
}
@Override
public Order updateOrder(Order order, boolean throwEx) {
Order orderNew = this.orderRepository.save(order);
if(throwEx){
throw new RuntimeException("throw a ex");
}
return orderNew;
}
}
지식 확장1.전통 적 인 jpa 방식 을 사용 하면@EnableJpa Repositories 는 설정 할 필요 가 없고 설정 해도 영향 이 없습니다.실현 방식 은 다음 과 같다.
ds1 관련 DaoImpl
@PersistenceContext
private EntityManager entityManager;
ds2 관련 DaoImpl
@PersistenceContext(unitName = "secondDs")
private EntityManager entityManager;
ds1 의 entity Manger 가@Primary 를 발 표 했 기 때문에 유닛 Name 을 가리 킬 필요 가 없습니다.ds2 는 가리 켜 야 합 니 다.정확 한 enity Manager 를 주입 하면 데이터 베 이 스 를 직접 조작 할 수 있 습 니 다.service 층 은 위 와 같 습 니 다.@Transactional("xxxManager")은 사물 관리 자 를 가리 키 면 됩 니 다!
2.jdbc Template 방식 으로 Service 층 대상 에 직접 주입 하면 됩 니 다.so easy!
@Autowired
private JdbcTemplate jdbcTemplate;
@Autowired
private TransactionTemplate transactionTemplate;
@Resource(name="jdbcTemplate2")
private JdbcTemplate jdbcTemplate2;
@Resource(name="transactionTemplate2")
private TransactionTemplate transactionTemplate2;
자,spring boot 다 중 데이터 원본,완벽 한 해결!그리고 세 가지 데이터 베이스 조작 방법 은 모두 사물 을 포함한다.이미 실천 을 통 해 증명 되 었 다!이것 은 정부 가 내 놓 은 가장 좋 은 실천 이다.다만 공식 문 서 는 상세 하 게 쓰 지 않 았 을 뿐이다.며칠 동안 나 를 괴 롭 혔 다.이로써 spring boot 프레임 워 크 의 사용 은 일 단락 되 었 습 니 다!
이상 의 이 문 제 는 spring boot 1.5.4 다 중 데이터 소스 를 설정 하 는 문 제 를 해결 하 는 것 입 니 다.바로 작은 편집 이 여러분 에 게 공유 하 는 모든 내용 입 니 다.참고 가 되 고 저희 도 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Kotlin Springboot -- 파트 14 사용 사례 REST로 전환하여 POST로 JSON으로 전환前回 前回 前回 記事 の は は で で で で で で を 使っ 使っ 使っ て て て て て リクエスト を を 受け取り 、 reqeustbody で 、 その リクエスト の ボディ ボディ を を 受け取り 、 関数 内部 ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.