有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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)我的前提是错误的,一个表中有数十亿个条目,并且高并发性并不会显著降低查询速度


共 (2) 个答案

  1. # 1 楼答案

    如果您使用的是hibernate实体类,那么您可以始终对同一数据源使用不同的模式,前提是其他模式对于在数据源中映射的特定用户是可访问的

    可以在实体类中使用Table注释的schema属性。使用以下语法来使用不同的模式

    @Table(name="TABLE_NAME",schema="SCHEMA2")

  2. # 2 楼答案

    听起来你在描述一个多租户解决方案。请参阅the Hibernate documentation以获得更详细的描述,以及如何对数据进行分区的一些选项

    注意:我们目前正在尝试实现基于模式的多租户方法:)