最近做了个项目,他们要求在主数据库中存一个表,记录了所有要连接的数据库,然后客户可以任意选择要连接哪个数据库。但是,连到那个数据库,只是获取某一部分信息,而像日志、注释等信息还要存在主库中。
我们选的是ibatis框架作为数据库层,用mysql实验的时候,是用c3p0创建动态数据库,然后调用getSqlMapClientTemplate().setDataSource(DataSource dataSource)方法将数据源赋给ibtis,这样换数据源时,spring不用重启就可以。
但后来换了sqlserver发现不行,虽然数据库照样创建,但是ibatis还是连接的以前的主库,所以为这个烦恼了很长时间,现在想了一个方法,用aop来实现切换库。
@Before("execution(public * com.casic.dao.DmRleaseDao.*(..)) or execution(public * com.casic.dao.ReleaseHistoryDao.*(..)) or execution(public * com.casic.dao.ReleaseObjectDao.*(..)) "
+ " or execution(public * com.casic.dao.ReleaseResourceDao.*(..)) or execution(public * com.casic.dao.SecuritLevelDao.*(..)) or execution(public * com.casic.dao.StructureDmoduleDao.*(..))"
+ " or execution(public * com.casic.dao.StructureObjectDao.*(..))")
public void changeDataSource() {
//得到当前项目的action
ProjectAction pa = new ProjectAction();
//获得用户选择的数据库
String dataSource = (String) pa.getSession().get("dataSource");
if (dataSource != null && !dataSource.equals("")) {
System.out.println("改变数据源++++++++++++++++++++++++++++++++++++");
System.out.println(pa.getSession().size()
+ ".....................................");
System.out.println(pa.getSession().get("dataSource")
+ "------------------------------");
this.getSqlMapClientTemplate().update(
"DataSource.changeDataSource", dataSource);
}
}
而在DataSource.xml里,这样
<update id="changeDataSource" parameterClass="java.lang.String">
use #value#;
</update>
就可以在每一个dao类中的方法执行前执行一次use XXX,来切换数据库。虽然方法烂了点,但总算是达到功能了。
分享到:
相关推荐
在现代的高并发、大数据量的应用系统中,数据库的读写分离是一种常见...通过这样的设计,我们能有效地利用AOP实现MySQL数据库的读写分离,提高系统的性能和稳定性。同时,这种解耦的编程方式也有利于代码的维护和扩展。
在Spring Boot项目中实现多数据源动态切换是一项高级特性,能够使应用根据不同业务需求访问不同的数据库,从而实现服务的解耦和数据库操作的优化。该技术的关键在于如何在同一个应用中配置和使用多个数据源,以及...
总结来说,通过Spring Boot的AOP机制,我们可以优雅地实现数据库读写分离,提高系统的并发能力和响应速度。这种方式既保持了代码的整洁,又实现了功能的灵活性,是企业级应用开发中的一个实用技巧。在实践中,需要...
2、能够清楚的知道如何用spring aop实现自定义注解以及注解的逻辑实现 (需要知道原理的请看spring aop源码,此处不做赘述) 3、可在现有源码上快速进行功能扩展 4、spring boot,mybatis,druid,spring aop的使用
以下将详细讲解如何利用Spring AOP来实现多数据库的读写分离。 首先,了解读写分离的基本概念。读写分离是指在一个数据库系统中,将读操作和写操作分配到不同的数据库服务器上,通常读操作远大于写操作,这样可以...
这些代码可能涉及到如何创建分页对象,如何与数据库交互获取分页数据,以及如何在AOP中使用动态代理进行拦截和处理。 总的来说,Java分页、动态代理和AOP是Java开发中的关键技术,它们能帮助我们构建出更加高效、可...
Spring AOP实现Redis缓存数据库查询 Spring AOP(Aspect-Oriented Programming,面向方面编程)是一种编程技术,可以将散落在各个对象之间的逻辑提取出来,封装成一个个独立的模块,并将这些模块组合起来,形成一...
在数据库读写分离中,AOP可以用来动态地决定数据请求应该路由到读库还是写库。当一个方法被调用时,AOP代理会检查该方法是否涉及写操作,如果是,则路由到写库;否则,路由到读库。 3. **Alibaba Druid**:Druid是...
在这个项目中,我们利用自定义的Aop注解来实现数据源的动态切换。自定义注解可以附加在方法上,当该方法被调用时,AOP会捕获这个调用并执行相应的逻辑,即切换到指定的数据源。 具体实现步骤如下: 1. 定义数据源...
在Spring Boot 2.1.5版本中,开发...通过上述方式,Spring Boot结合Druid和AOP注解,可以有效地实现多数据源的动态切换,满足复杂业务场景下的数据库管理需求。在实际项目中,可以根据具体的业务需求进行调整和优化。
C#作为.NET框架的主要编程语言,提供了强大的支持来实现AOP,特别是在处理事务管理方面。事务是数据库操作的核心概念,确保数据一致性并能够在异常情况下进行回滚。 C#实现AOP事务的关键在于利用特性(Attribute)...
在这个"springAOP实现数据字典.zip"压缩包中,我们主要关注的是如何利用Spring AOP来实现数据字典的功能。数据字典是系统设计中一个关键的组成部分,它存储了系统中所有数据的描述,包括数据项、数据结构、数据流、...
基于SpringAOP的数据库读写分离的实现,可以点击查看我的博客,有详细讲解http://blog.csdn.net/qism007
资源中整合了SSM,并实现了数据库读写分离。使用mybatis-generator动态生成mapper、dao、po,封装了常用的工具类,后期还继续维护,加上分布式缓存等等。
在项目结构中,"SpringBoot-boke-master"可能是项目的源码目录,包含了应用的主类、配置文件、实体类、Mapper接口、XML配置文件、Service层、Controller层以及AOP、过滤器和拦截器的相关实现。通过阅读和分析这些...
在WCF中,实现AOP拦截器可以让我们在服务调用前后执行特定的逻辑,比如添加日志、验证权限或处理异常。 在本DEMO中,AOP拦截器被用来在消息传递过程中捕获和处理消息。这可能包括验证请求的合法性、添加操作日志、...
本文将深入探讨如何利用SpringBoot的AOP(面向切面编程)特性,结合MyBatis的多数据源配置,实现动态表名的分库分表查询。 首先,我们需要理解SpringBoot的核心概念。SpringBoot是Spring框架的简化版本,它预设了...
Spring AOP的实现主要依赖于两种技术:动态代理和AspectJ。对于接口,Spring使用Java动态代理(JDK Proxy)创建代理对象;而对于类,Spring则使用CGLIB库生成子类代理。这两种方式都是在运行时生成代理对象,从而在...
在Spring Boot中,AOP(面向切面编程)和多数据源的整合是常见的应用场景,尤其是在大型企业级项目中,为了实现数据的隔离或者优化数据库访问,常常需要配置多个数据源。本文将深入探讨如何使用Spring Boot的AOP注解...