Spring + Hibernate:读/写不同的数据源和数千个mysql数据库

时间:2017-04-10 13:42:10

标签: java mysql spring hibernate database-replication

我需要使用单独的读/写MySQL服务器。一位作家和一位(或多位)阅读副本。

这样做的最佳方式是什么?

enter image description here

我找到了很多例子:

http://www.dragishak.com/?p=307

使用特殊的JDBC驱动程序:com.mysql.jdbc.ReplicationDriver

用法是:

@Transactional(readOnly=true)
@ReadOnlyConnection
public Result serviceMethod(…) {
   …
}

https://stackoverflow.com/a/33169879/1974494

使用Spring AbstractRoutingDatasource

用法:

@Transactional(readOnly = true)
public Page<BookDTO> getBooks(Pageable p) {
  try{
    DbContextHolder.setDbType(DbType.REPLICA1);   // <----- set ThreadLocal DataSource lookup key

在每种方法中,我需要设置DbType。

可以自动发送&#34;读取查询&#34;复制服务器和&#34;写查询&#34; (插入/更新)到主服务器?

第二个问题:

我想每个用户有一个mysql数据库(非常大)。我期待大约2 000名用户。所以我不能为每个用户*读者和作者定义数据源。

示例:

spring.ds_items.driverClassName=com.mysql.jdbc.Driver
spring.ds_items.url=jdbc:mysql://mysql-master/user1
spring.ds_items.username=root 
spring.ds_items.password=12345

spring.ds_items.driverClassName=com.mysql.jdbc.Driver
spring.ds_items.url=jdbc:mysql://mysql-replica1/user1
spring.ds_items.username=root 
spring.ds_items.password=12345

spring.ds_items.driverClassName=com.mysql.jdbc.Driver
spring.ds_items.url=jdbc:mysql://mysql-master/user2
spring.ds_items.username=root 
spring.ds_items.password=12345

spring.ds_items.driverClassName=com.mysql.jdbc.Driver
spring.ds_items.url=jdbc:mysql://mysql-replica1/user2
spring.ds_items.username=root 
spring.ds_items.password=12345

我想拥有一个主要的mysql数据库&#34;表格如下:

user   db_name
--------------
test1  db_test1
test2  db_test2

如果我需要用户test2的一些数据,我会查看&#34;主数据库&#34;并获取要使用的数据库db_test2的信息。之后,将查询发送到数据库db_test2

1 个答案:

答案 0 :(得分:4)

最佳方式是使用MySQL Connector / J复制感知驱动程序配置。您的连接字符串将如下所示

jdbc:mysql:replication://[master host][:port],[slave host 1][:port][,[slave host 2][:port]]...[/[database]]

将事务标记为只读后,它将自动路由到只读从设备

https://dev.mysql.com/doc/connector-j/5.1/en/connector-j-master-slave-replication-connection.html