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