企业网站建设后期维护费用网站 建设 语言
- 作者: 五速梦信息网
- 时间: 2026年03月21日 09:58
当前位置: 首页 > news >正文
企业网站建设后期维护费用,网站 建设 语言,wordpress 微信login,广州网站建设广州网络推广公司好对于数据量很大的复杂系统#xff0c;有时候会采用分库或者分表的减轻单台数据库服务器压力#xff0c;截止目前有一些工具直接支持读写分离等#xff0c;例如ShardingSphere#xff0c;如果不采用工具框架#xff0c;从编码出发#xff0c;如何实现从多个数据库读写数据… 对于数据量很大的复杂系统有时候会采用分库或者分表的减轻单台数据库服务器压力截止目前有一些工具直接支持读写分离等例如ShardingSphere如果不采用工具框架从编码出发如何实现从多个数据库读写数据呢本篇博客将介绍三种代码实现思路并提供完整Demo。方式一将不同DB的操作存放到不同目录下来实现分库操作 通过该方式达到分库的操作实际很简单第一:在application.properties文件中通过不同的前缀区分不同的数据库第二:为不同的database编写配置类在配置类中定义了repository的目录通过前缀创建不同的Database bean第三在不同的目录编写service,repository,controller.这样在不同controller调用serviceservice再调用repository时因为不同的数据库配置的repository目录不同故调用不同controller时实际使用的是不同的数据库。这种实现思路本质实现的目标是将不同的表放入不同Database中并不是将相同的表放入不同的数据库例如读写分离。完整代码可查看Demo1。方式二通过切面编程实现读写分离 实际业务场景中为了提升数据库处理数据能力可能需要进行读写分离即同一张表写操作在一个数据库读操作在另外一个数据库这两个数据库存放了相同的表数据。那如何编写代码实现这一目标呢如下图所示首先在application.properties文件中通过不同的前缀来区分数据库在配置文件类中定义不同DataSource bean接着在切面代码中如果方法是以find,select,query,search等开头那么去查询slave数据库否则从master数据库操作数据这样就实现了读写分离。 上面代码片段中本质是通过DataSourceContextHolder来切换数据库的而DataSourceContextHolder本身只有一些get(),set()方法背后是如何工作的呢如下图代码所示在定义EntityManagerFactoryBean的时候注入了routingDataSource而RoutingDataSource默认会设置masterDataSource为默认的目标数据库当通过DataSourceContextHolder重新设置目标数据库后RoutingDataSource中的目标数据库会同步更新而EntityManagerFactoryBean是通过routingDataSource构建出来的所以最终实现了不同数据库的切换操作。完整代码可查看Demo2。方式三通过切面编程实现分表 如下图所示虽然都是通过切面编程的方式但是这个切面是针对注解当添加注解SwithDataSource(valuexxdb)时下面的repository都切换到了对应的数据库右边图片是切面编程的部分代码本质是调用AbstractRoutingDataSourceImpl.setDatabaseName(annotation.value())。那AbstractRoutingDataSourceImpl是如何实现数据库切换的呢查看AbstractRoutingDataSourceImpl的代码overwrite中只有一些get(),set()方法。接着查看定义entityManagerFactoryBean的class在这个class中定义了entityManagerFactoryBean,dataSource()这个bean中设置了默认default的database当设置新的database后完成数据库的切换。完整代码细节可查看demo3. 从前面的三个例子看使用多个数据源时Entity和Repository不用修改。只要设置好EnableJpaRepositories就能让Repository找到正确的数据源自动装配。其中主要的两个参数是创建Entity的entityManagerFactoryRef和创建Repository的transactionManagerRef。为了创建EntityManagerFactory我们需要借助DataSourceProperties创建DataSource对象。而使用ConfigurationProperties可以自动从配置文件生成DataSourceProperties。创建TransactionManager则需要指定SQL方言。方言类名可以通过Environment从配置中读取。从上面例子中可以看到都是通过EntityManagerFactoryBuilder创建了LocalContainerEntityManagerFactoryBean那LocalContainerEntityManagerFactoryBean的作用是什么呢实际JPA 定义了两种类型的实体管理器应用程序管理类型Application-managed当应用程序向实体管理器工厂直接请求实体管理器时工厂会创建一个实体管理器。在这种模式下程序要负责打开或关闭实体管理器并在事务中对其进行控制。这种方式的实体管理器适合于不运行在 Java EE 容器中的独立应用程序。容器管理类型Container-managed实体管理器由 Java EE 创建和管理。应用程序根本不与实体管理器工厂打交道。相反实体管理器直接通过注入或 JNDI 来获取。容器负责配置实体管理器工厂。这种类型的实体管理器最适用于 Java EE 容器在这种情况下会希望在 persistence.xml 指定的 JPA 配置之外保持一些自己对 JPA 的控制。 这对想使用 JPA 的 Spring 开发者来说又意味着什么呢其实这并没太大的关系。不管你希望使用哪种 EntityManagerFactorySpring 都会负责管理 EntityManager。如果你使用的是应用程序管理类型的实体管理器Spring 承担了应用程序的角色并以透明的方式处理 EntityManager。在容器管理的场景下Spring 会担当容器的角色。这两种实体管理器工厂分别由对应的 Spring 工厂 Bean 创建LocalEntityManagerFactoryBean 生成应用程序管理类型的 EntityManagerFactoryLocalContainerEntityManagerFactoryBean 生成容器管理类型的 EntityManagerFactory。EntityManagerFactoryBuilder采用构造者模式传说数据库连接相关信息即可完成对数据库的访问。 实现数据源切换用到了AbstractRoutingDataSource,该class包含的常见的属性以及含义如下targetDataSources是目标数据源集合defaultTargetDataSource是默认数据源resolvedDataSources是解析后的数据源集合resolvedDefaultDataSource是解析后的默认数据源 要实现数据源切换实际是自定义一个类扩展AbstractRoutingDataSource抽象类相当于数据源DataSourcer的路由中介可以实现在项目运行时根据相应key值切换到对应的数据源DataSource上。先看看AbstractRoutingDataSource的源码 从源码可以看出AbstractRoutingDataSource继承了AbstractDataSource并实现了InitializingBeanAbstractRoutingDataSource的getConnection()方法调用了determineTargetDataSource()的该方法这里重点看determineTargetDataSource()方法代码方法里使用到了determineCurrentLookupKey()方法它是AbstractRoutingDataSource类的抽象方法也是实现数据源切换要扩展的方法该方法的返回值就是项目中所要用的DataSource的key值拿到该key后就可以在resolvedDataSource中取出对应的DataSource如果key找不到对应的DataSource就使用默认的数据源。自定义类扩展AbstractRoutingDataSource类时就是要重写determineCurrentLookupKey()方法来实现数据源切换功能具体代码如下所示以上就是对于多数据库切换的介绍。
- 上一篇: 企业网站建设合同百度文库wordpress怎么用SSH
- 下一篇: 企业网站建设及前期准备注册企业网站
相关文章
-
企业网站建设合同百度文库wordpress怎么用SSH
企业网站建设合同百度文库wordpress怎么用SSH
- 技术栈
- 2026年03月21日
-
企业网站建设国内外差异网络营销推广的方案
企业网站建设国内外差异网络营销推广的方案
- 技术栈
- 2026年03月21日
-
企业网站建设公司丰台做网站被骗了怎么办
企业网站建设公司丰台做网站被骗了怎么办
- 技术栈
- 2026年03月21日
-
企业网站建设及前期准备注册企业网站
企业网站建设及前期准备注册企业网站
- 技术栈
- 2026年03月21日
-
企业网站建设及维护费用用net语言做网站平台好不好
企业网站建设及维护费用用net语言做网站平台好不好
- 技术栈
- 2026年03月21日
-
企业网站建设技企业管理咨询类公司
企业网站建设技企业管理咨询类公司
- 技术栈
- 2026年03月21日






