Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >不使用Spring3和MyBatis路由DataSource

不使用Spring3和MyBatis路由DataSource
EN

Stack Overflow用户
提问于 2012-10-24 18:38:25
回答 2查看 1.4K关注 0票数 0

我有一个默认的数据库,有时我必须在另一个数据库中进行选择。

我在这里搜索了许多关于这方面的博客和问题,但都不能让它工作。

已尝试http://blog.springsource.org/2007/01/23/dynamic-datasource-routing/方式。没什么。

RouterDataSource类的代码:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public class RouterDataSource extends AbstractRoutingDataSource {   
    @Override
    protected DataSourceEnum determineCurrentLookupKey() {
         return DataSourceContextHolder.getTargetDataSource();
    }   
}

DataSourceContextHolder类的代码:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public class DataSourceContextHolder {
     private static final ThreadLocal<DataSourceEnum> contextHolder = new ThreadLocal<DataSourceEnum>();

     public static void setTargetDataSource(DataSourceEnum targetDataSource) {
         Assert.notNull(targetDataSource, "Target data source cannot be null");
         contextHolder.set(targetDataSource);
     }

     public static DataSourceEnum getTargetDataSource() {
         if (contextHolder.get() != null)
             return (DataSourceEnum) contextHolder.get();
         else
             return DataSourceEnum.DB1;
     }

     public static void resetDefaultDataSource() {
         contextHolder.remove();
     }
}

修改数据库的方法调用代码:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@Override
public CodeHD getCategoryByCode(String code) throws BusinessException {
    DataSourceContextHolder.setTargetDataSource(DataSourceEnum.DATABASE2);
    return (CodeHD) persistency.getObject(GETOBJECT_BY_CODE, code);
}

DatasourceEnum类的代码:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public enum DataSourceEnum {
    DB1,
    DB2;
}

最后是我的applicationContext.xml上的配置:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<bean id="parentDataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource" abstract="true">
    <property name="driverClass" value="oracle.jdbc.pool.OracleDataSource" />
    <property name="acquireIncrement" value="10" />
    <property name="idleConnectionTestPeriod" value="60" />
    <property name="maxStatements" value="50" />
    <property name="minPoolSize" value="5" />
    <property name="maxPoolSize" value="15" />
</bean>

<bean id="database1DS" parent="parentDataSource">
    <property name="jdbcUrl" value="jdbc:oracle:thin:@database1:1521:xe" />
    <property name="user" value="user" />
    <property name="password" value="password" />
</bean>

<bean id="database2DS" parent="parentDataSource">
    <property name="jdbcUrl" value="jdbc:oracle:thin:@database2:1521:xe" />
    <property name="user" value="user" />
    <property name="password" value="password" />
</bean>

<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
     <property name="dataSource" ref="dataSource"/>
  </bean>

<bean id="dataSource" class="package.RouterDataSource">
    <property name="defaultTargetDataSource" ref="database1DS"/>
    <property name="targetDataSources">
        <map key-type="package.DataSourceEnum">
            <entry key="DB1" value-ref="database1DS"/>
            <entry key="DB2" value-ref="database2DS"/>
        </map>
    </property>
</bean>

问题是,当我将它设置为DB2时,它不会改变。

有谁可以帮我?

EN

回答 2

Stack Overflow用户

发布于 2012-10-24 18:53:48

尝试将静态方法设置为非静态方法,如果上下文持有者,则传递R引用。

票数 0
EN

Stack Overflow用户

发布于 2012-10-24 20:15:45

首先,确保database2DS工作正常。将defaultTargetDatasource设置为database2DS,并验证它是否仍在使用DB1,以及是否没有使用database2DS作为默认设置,并且没有其他错误。如果AbstractRoutingDataSource无法解析targetDataSources中的DataSource,则无法切换到它。

AbstractRoutingDataSource只会在调用getConnection时更改DataSource。无论您使用的是哪种持久性框架,都可能是在缓存连接,而不是在persistency.getObject()之间调用getConnection。无论您如何获取持久性对象,请在DataSourceContextHolder中更改数据源后尝试获取一个新的持久性对象。如果这解决了您的问题,请尝试创建一个类来维护持久性对象并处理数据源的更改。这样,当您更改数据源时,您可以在一个地方修改持久性管理器对象。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13055609

复制
相关文章
视频一方是recvonly时Freeswitch不转包问题记录
问题:非代理模式下,视频媒体主叫如果是recvonly,主叫收不到被叫发过来的视频包;
呱牛笔记
2023/05/02
8140
视频一方是recvonly时Freeswitch不转包问题记录
记录使用mongoDB时遇到的有趣问题
最近在开发金融类的k线、盘口业务,而这些业务的海量数据如何存储,公司的技术选型,选择了MongoDB。
Blue_007
2023/10/21
2230
记录使用mongoDB时遇到的有趣问题
首页SQLPHP向MySQL插入记录时乱码问题
Navicat for MySql 新建数据库时编码格式设置成:utf8 -- UTF-8 Unicode 排序规则:utf8_general_ci。个人建议,为了避免不必要的麻烦,凡是涉及编码格式的开发工具,安装后第一时间设置成utf8。
cherishspring
2019/10/30
1.2K0
问题定位记录
JVM(HotSpot JVM)进行了优化。当第一次发生异常(通常为NullPointerException)时,将打印完整的堆栈跟踪,并且JVM会记住堆栈跟踪(或者可能只是代码的位置)。 当该异常经常发生时,将不再打印堆栈跟踪,这既可以实现更好的性能,【CoederBaby】又不会使相同的堆栈跟踪充满日志。
小石头
2022/11/10
3670
问题记录
测试反馈的是,拍摄了一张图片,上传之后,安卓可以加载出来,iOS显示是黑色,其他图片正常;
莫空9081
2021/08/30
1.3K0
记录一次外包php问题:query方法不执行
德宏大魔王
2023/08/08
1690
JVM学习记录-类加载时机
虚拟机把描述类的数据从Class文件加载到内存,并对数据进行校验、转换解析和初始化,最终形成可以被虚拟机直接使用的Java类型,这就是类的加载机制。
纪莫
2018/08/01
2970
JVM学习记录-类加载时机
zabbix问题记录
zabbix部署好,在使用一段时间后,出现了不少报错,在此简单做一记录。 1)Zabbix监控界面报错“Lack of free swap space”解决 公司线上部署的zabbix3.0的监控界面首页报错说无交换内存主机“Lack of free swap space” 解决此问题的步骤如下: 选择Configuration->Templates(模板),在模板界面中选择Template OS Linux右侧的Triggers(触发器),在触发器页面中打开Lack of free swap space
洗尽了浮华
2018/01/22
3.2K1
zabbix问题记录
JVM学习记录-类加载器
JVM设计团队把类加载阶段中的“通过一个类的全限定名来获取描述此类的二进制字节流”这个动作放到Java虚拟机外面去实现,以便让应用程序自己决定如何去获取所需要的类。实现这个动作的代码模块称为“类加载器”。
纪莫
2018/08/01
3760
JVM学习记录-类加载器
JavaScript问题记录
JS测试 浏览器console即可 js中const、var、let区别 const定义的变量不可以修改,而且必须初始化。 const b = 2;//正确 // const b;//错误,必须初始化 console.log('函数外const定义b:' + b);//有输出值 // b = 5; // console.log('函数外修改const定义b:' + b);//无法输出 var定义的变量可以修改,如果不初始化会输出undefined,不会报错 var a = 1; // var a
嘉美伯爵
2021/01/18
3440
flink 问题记录
转发请注明原创地址:http://www.cnblogs.com/dongxiao-yang/p/7652337.html
sanmutongzi
2020/03/04
7790
Linux问题记录
背景描述:删除文件夹时,文件中存在文件“.user.ini”,报出错误“删除user.ini提示Operation not permitted”。
郭顺发
2023/07/06
1940
maven 问题记录
在使用公司内部的 maven 仓库编译项目时,由于新加入了几个依赖包,第一次编译失败了,可能原因是 maven 私服找不到相关jar。此后在修复了公司内部 maven 仓库后编译项目出现错误
acc8226
2022/05/17
1.2K0
k8s1.15安装istio时问题记录
报错1: horizontalpodautoscaler.autoscaling/istio-pilot created mutatingwebhookconfiguration.admissionregistration.k8s.io/istio-sidecar-injector created unable to recognize “/root/istio.yaml”: no matches for kind “attributemanifest” in version “config.isti
dogfei
2020/07/31
1.2K0
Ceph问题记录
1、客户端使用ceph-fuse挂载ceph存储时报错 # ceph-fuse -m 192.168.152.153:6789 /cephfs 2019-05-16 17:07:48.213235 7f6cce28af00 -1 asok(0x564b992e2000) AdminSocketConfigObs::init: failed: AdminSocket::bind_and_listen: failed to bind the UNIX domain socket to '/var/run/cep
dogfei
2020/07/31
1.2K0
Docker 问题记录
容器经常用了一段时间就自动退出了,docker ps已经找不到了,在docker ps -a里面了。
郭顺发
2023/07/17
1590
[iOS] 小问题记录
iOS 往数据库里写保存文件路径的时候,不要写全路径,因为软件更新或者重新安装沙盒路径会变
wOw
2018/09/18
3.4K0
Apache访问日志+不记录静态文件
Apache访问日志 : 访问日志:顾名思义就是当有人访问咱们的站点,就会被记录些信息!其实这个还是蛮重要,尤其是站点受到攻击,直接命令的日志可以让我们迅速找到攻击者IP的规律! 根据咱们之前的配置,访问日志如下: <VirtualHost *:80> DocumentRoot "/data/wwwroot/test3.com" ServerName www.test3.com ServerAlias www.haha.com #<Directory /data/wwwroot
老七Linux
2018/05/09
1.8K0
11.22 访问日志不记录静态文件
访问日志不记录指定类型的文件目录概要 网站大多元素为静态文件,如图片、css、js等,这些元素可以不用记录 把虚拟主机配置文件改成如下: <VirtualHost *:80> DocumentRoot "/data/wwwroot/www.123.com" ServerName www.123.com ServerAlias 123.com SetEnvIf Request_URI ".*\.gif$" img SetEnvIf Request_URI ".*\.j
运维小白
2018/02/06
1K0
11.22 访问日志不记录静态文件
Mac 问题记录
郭顺发
2023/07/06
1710

相似问题

计量器上传错误记录

13

加载多个记录时出现撬动Gem问题

12

MarkLogic记录加载器问题

11

记录应用程序块不记录到文件

27

Launchctl加载后不工作/记录

12
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文