java - Spring + hibernate : read/write different datasource and thousands mysql databases

标签 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。

是否可以自动向副本服务器发送“读取查询”并向主服务器发送“写入查询”(插入/更新)?


第二个问题:

我希望每个用户有一个 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 数据库”,其中的表类似于:

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

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

最佳答案

最好的方法是使用 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

关于java - Spring + hibernate : read/write different datasource and thousands mysql databases,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43324861/

相关文章:

java - 写入 ZIP 文件的文件仅在运行时可用 [Java]

java - MySQL DB 或 JDBC 驱动程序不处理 LocalDate.MAX

mysql - 将 mysql 查询转换为 Eloquent 查询问题

java - Web 服务客户端/消费者 - 浏览器或 Webstart/JNLP 或 Swing

java - 跨多线程的 Spring bean 引用

java - 从 InitialContext 检索数据源时出现 ClassCastException

java - 如何在HDFS中的文件上运行系统命令?

java - 为什么所有匿名类都是隐式最终的?

mysql - 当主查询没有返回记录时如何从子查询中获取计数

java - Spring中DataBinder和ConversionService的区别