【发布时间】:2017-09-05 14:19:59
【问题描述】:
我需要使用单独的读写器 MySQL 服务器。一个写入器和一个(或多个)只读副本。
最好的方法是什么?
我找到了很多例子:
http://www.dragishak.com/?p=307
使用特殊的 JDBC 驱动:com.mysql.jdbc.ReplicationDriver
而用法是:
@Transactional(readOnly=true)
@ReadOnlyConnection
public Result serviceMethod(…) {
…
}
https://stackoverflow.com/a/33169879/1974494
使用弹簧AbstractRoutingDatasource:
用法:
@Transactional(readOnly = true)
public Page<BookDTO> getBooks(Pageable p) {
try{
DbContextHolder.setDbType(DbType.REPLICA1); // <----- set ThreadLocal DataSource lookup key
在每个方法中我都需要设置 DbType。
是否可以自动向副本服务器发送“读取查询”和向主服务器发送“写入查询”(插入/更新)?
第二个问题:
我希望每个用户拥有一个 mysql 数据库(非常大)。我预计大约有 2 000 个用户。所以我不能为每个用户定义数据源 * reader+writer.
例子:
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 数据库”,其表如下:
user db_name
--------------
test1 db_test1
test2 db_test2
如果我需要用户 test2 的一些数据,我会查看“主数据库”并获取要使用的数据库 db_test2 的信息。之后将查询发送到数据库db_test2。
【问题讨论】:
标签: java mysql spring hibernate database-replication