Spring Boot:如何使用多个模式并动态选择在运行时为每个请求使用哪个模式
前提:我选择这样做是因为我最终可能会有几千个模式,每个模式都有(其中包括)1个表和几百万个条目。 另一种方法是在一个模式中拥有一个表,其中包含几十亿个条目。
详细阐述这个问题的最好方法是提供一个简单的例子。 考虑以下:
User.java
@Entity(name = "user") public class User { @Id @GeneratedValue @Column(name = "id") private Long id; @Column(name = "username") private String username; // getters and setters... }
UserDao.java
@Repository public interface UserDao extends CrudRepository {}
UserService.java
public interface UserService { User getUser(Long id); }
UserServiceBean.java
@Transactional @Service public class UserServiceBean implements UserService { @Autowired private UserDao dao; @Override public User getUser(Long id) { return dao.findOne(id); } }
UserController.java
@RestController public class UserController { @Autowired private UserService userService; @RequestMapping( value = "/api/users/{id}", method = RequestMethod.GET, produces = MediaType.APPLICATION_JSON_VALUE) public ResponseEntity getUser( @PathVariable("id") Long id) { User user = userService.getUser(id); return new ResponseEntity(user, HttpStatus.OK); } }
我想扩展到以下function:在URL中提供另一个ID,以便从不同的表返回用户数据。
UserController.java
... @RequestMapping( value = "/api/users/{id}", method = RequestMethod.GET, produces = MediaType.APPLICATION_JSON_VALUE) public ResponseEntity getUser( @PathVariable("id") Long id, @RequestParam(value = "tlbid") Long tblId) { User user = userService.getUser(id, tblId); return new ResponseEntity(user, HttpStatus.OK); }
现在,UserService会将该ID解码为可能对spring有用的内容,以便从不同的表中获取数据。
UserServiceBean.java
... public User getUser(Long id, Long tblId) { Object o = doMagic(tblId); // What should 'o' be and how could I use this? }
所有表都具有相同的结构和名称,但条目不同。 这些表必须位于不同的数据库中,或位于同一数据库中,但位于不同的模式上。
我想知道:
a)如何建立一个数据库连接并为每个请求指定不同的模式。
b)如何在必要时创建新的数据库连接(我会为进一步的请求维护它们),并指定每次应该在哪个连接上进行请求。
c)我的前提是错误的,并且在表中有数十亿条目并且高并发性不会显着降低查询速度。
如果您正在使用hibernate实体类,那么您可以始终对同一数据源使用不同的模式,前提是其他模式可供Datasource中映射的特定用户访问。
您可以在实体类中使用Table
批注的schema
属性。 使用以下语法来使用不同的模式
@Table(name="TABLE_NAME",schema="SCHEMA2")