在 d2js 使用多种数据源如spring数据源
不少人误以为 d2js 只能通过 database.js 指定一个数据库,是一个单数据库方案。实际上 d2js 也可以使用多个数据库。
在 WEB-INF/jslib/d2js/base.js 的末尾,是 dj2s 创建 DataSource 为 d2js 的 SqlExecutor 的主要代码:
D2JS.init = function(){
var datasource = application.datasource || (application.datasource = (function(){
var properties = new java.util.Properties();
for(var k in datasourceConfig){
properties.setProperty(k, datasourceConfig[k] + '');
}
return Java.type('org.apache.commons.dbcp2.BasicDataSourceFactory').createDataSource(properties);
}()));
var sqlExecutor = new org.siphon.jssql.SqlExecutor(datasource, engine, JSON);
sqlExecutor.defaultJsonDbType = datasourceConfig.defaultJsonDbType || 'JSONB';
sqlExecutor.columnNameCase = datasourceConfig.columnNameCase || 0; // LOWER
sqlExecutor.useColumnLabelAsName = datasourceConfig.useColumnLabelAsName || false; ;
d2js = handler = new D2JS(sqlExecutor);
engine.put('handler', handler);
engine.put('d2js', d2js);
}
这个 D2JS.init 函数在 application.d2js.js 和 application.jssp.js 中调用。
通过自定义 D2JS.init 函数,可以自定义数据库连接。
如对于spring,可编写 spring-datasource.js :
D2JS.init = function(){
var sqlExecutor = D2JS.createExecutorForDataSource("dataSource");
d2js = handler = new D2JS(sqlExecutor);
engine.put('handler', handler);
engine.put('d2js', d2js);
}
D2JS.createExecutorForDataSource = function(beanName){
var WebApplicationContextUtils = Java.type('org.springframework.web.context.support.WebApplicationContextUtils');
var wac = WebApplicationContextUtils.getRequiredWebApplicationContext(servletContext);
var datasource = wac.getBean(beanName);
var sqlExecutor = new org.siphon.jssql.SqlExecutor(datasource, engine);
sqlExecutor.columnNameCase = 1; // KEEP
sqlExecutor.useColumnLabelAsName = true;
return sqlExecutor;
}
对于其它数据源,如 h2 db 可编写:
var executor = (function createMemExecutor(){
var datasource = (function(){
var properties = new java.util.Properties();
for(var k in datasourceConfig){
properties.setProperty(k, datasourceConfig[k] + '');
}
return Java.type('org.apache.commons.dbcp2.BasicDataSourceFactory').createDataSource(properties);
})();
var sqlExecutor = new org.siphon.jssql.SqlExecutor(datasource, engine);
sqlExecutor.columnNameCase = datasourceConfig.columnNameCase || 0; // LOWER
sqlExecutor.useColumnLabelAsName = true;
return sqlExecutor;
})();
修改 application.d2js.js 和 application.jssp.js,在 imports("jslib/d2js.js"); 后执行
imports("./spring-datasource.js");
这样,spring-datasource.js 中的 D2JS.init 就覆盖了 base.js 中原来的 D2JS.init,实现了使用 spring 数据源或其它数据源。
如何让多个数据源并存呢?
如上面的内存数据源,登记为 d2js.memSqlExecutor。
d2js.memSqlExecutor = (function createMemExecutor(){
var datasource = (function(){
var properties = new java.util.Properties();
for(var k in datasourceConfig){
properties.setProperty(k, datasourceConfig[k] + '');
}
return Java.type('org.apache.commons.dbcp2.BasicDataSourceFactory').createDataSource(properties);
})();
var sqlExecutor = new org.siphon.jssql.SqlExecutor(datasource, engine);
sqlExecutor.columnNameCase = datasourceConfig.columnNameCase || 0; // LOWER
sqlExecutor.useColumnLabelAsName = true;
return sqlExecutor;
})();
前面的博客介绍过,每个 d2js 实例都是从 d2js 对象复制的,所以每个 d2js 实例都会拥有 memSqlExecutor 成员。
使用时只要通过 this.executor = d2js.memSqlExecutor 就可以切换数据源(记得切换回来)。
如考虑为web容器环境,也可将设为 application.memSqlExecutor。
如果需要对多个数据源前后执行同一条语句,可按如下操作:
d2js.test = function(){
[sqlExecutor1, sqlExecutor2, this.executor].forEach(function(executor){
this.executor = executor; // 循环过程依次切换为 sqlExecutor1, sqlExecutor2, this.executor
this.execute(sql, {args})
}, this)
}
这个办法只有一个 d2js 对象,此外也可直接创建一些真正的 d2js 对象。
var d = new D2JS(this.executor);
for(var k in this){
if(this.hasOwnProperty(k)) {
d[k] = this[k];
} else {
break;
}
}
d.executor = executor1;
d 就是一个从当前 d2js 实例复制出来但是数据源不同的 d2js 对象。
在 d2js 使用多种数据源如spring数据源的更多相关文章
- 【JAVA】Spring 数据源配置整理
在Spring中,不但可以通过JNDI获取应用服务器的数据源,也可以直接在Spring容器中配置数据源,此外,还可以通过代码的方式创建一个数据源,以便进行无依赖的单元测试. 配置数据源 ...
- Spring 数据源配置二:多数据源
通过上一节 Spring 数据源配置一: 单一数据源 我们了解单一数据源的配置, 这里我们继续多个数据源的配置 如下(applicationContent.xml 内容) 一: Spring ...
- Spring 数据源
1.使用org.springframework.jdbc.datasource.DriverManagerDataSource说明:DriverManagerDataSource建立连接是只要有连接就 ...
- spring+myBatis 配置多数据源,切换数据源
注:本文来源于 tianzhiwuqis <spring+myBatis 配置多数据源,切换数据源> 一个项目里一般情况下只会使用到一个数据库,但有的需求是要显示其他数据库的内容,像这样 ...
- 43. Spring Boot动态数据源(多数据源自动切换)【从零开始学Spring Boot】
[视频&交流平台] àSpringBoot视频 http://study.163.com/course/introduction.htm?courseId=1004329008&utm ...
- Spring Boot 动态数据源(多数据源自己主动切换)
本文实现案例场景: 某系统除了须要从自己的主要数据库上读取和管理数据外.另一部分业务涉及到其它多个数据库,要求能够在不论什么方法上能够灵活指定详细要操作的数据库. 为了在开发中以最简单的方法使用,本文 ...
- (43). Spring Boot动态数据源(多数据源自动切换)【从零开始学Spring Boot】
在上一篇我们介绍了多数据源,但是我们会发现在实际中我们很少直接获取数据源对象进行操作,我们常用的是jdbcTemplate或者是jpa进行操作数据库.那么这一节我们将要介绍怎么进行多数据源动态切换.添 ...
- Spring Boot 动态数据源(Spring 注解数据源)
本文实现案例场景:某系统除了需要从自己的主要数据库上读取和管理数据外,还有一部分业务涉及到其他多个数据库,要求可以在任何方法上可以灵活指定具体要操作的数据库. 为了在开发中以最简单的方法使用,本文基于 ...
- Spring Boot 动态数据源(多数据源自动切换)
本文实现案例场景: 某系统除了需要从自己的主要数据库上读取和管理数据外,还有一部分业务涉及到其他多个数据库,要求可以在任何方法上可以灵活指定具体要操作的数据库. 为了在开发中以最简单的方法使用,本文基 ...
- Spring3.3 整合 Hibernate3、MyBatis3.2 配置多数据源/动态切换数据源 方法
一.开篇 这里整合分别采用了Hibernate和MyBatis两大持久层框架,Hibernate主要完成增删改功能和一些单一的对象查询功能,MyBatis主要负责查询功能.所以在出来数据库方言的时候基 ...
随机推荐
- /proc/pagetypeinfo
这个文件是将buddyinfo的内容进一步细分: Free pages count per migrate type at order -- 不同order 按照migrate type的空闲page ...
- 05-react的类组件和函数组件 -- 状态 state
// 函数组件是无状态的 既没有数据的 类似 vue 组件中的 data 数据 // 类组件是有状态的组件 是有数据的 是双向绑定的数据 是数据驱动视图的 负责UI的视图更新 (单个组件的私有数据组件 ...
- 71.登录失效,token过期怎么处理
1. 清除用户数据,直接跳转登录页重新登录 : 2. 短token 过期,使用 长 token 重新获取短 token ,然后重新请求 : 如果长 token 也过期了,就去重新登录获取 token ...
- CSP-J2/S2 2023 游记
可能早就应该发出来的游记. 2023-10-07 16:32. 前一天睡得比较晚,所以迟到了一点点. 上来先敲了个对拍,拍了一个 if a % 1000 = 0 then a++ 的 A + B,拍出 ...
- RocketMQ 全链路灰度探索与实践
本文作者:肖京,Spring Cloud Alibaba PMC,阿里云智能技术专家. 01 全链路灰度背景介绍 发布新版本时,为了有效.谨慎地验证新版本代码逻辑的正确性,通常会采用灰度发布,从而达到 ...
- AI五子棋_06 坐标表示到图形表示的算法 Python实现
AI五子棋 第六步 恭喜你到达第六步! 你已经成功实现了公钥体系最为关键的部分.现在服务器相信你就是你了,下面开始你的战斗. 五子棋的棋盘有15×15个交点,一共有225个交点,我们可以在每一个交点上 ...
- idea项目提交到码云
第一步:创建一个项目 第二步:在码云上新建一个项目.[注意把使用Readme复选框取消掉] 第三步:复制gitee地址 第四步:创建本地git仓库 第五步:选择自己需要上传到码云的项目名 第六步:提交 ...
- 强化学习:如何计算被环境系统截断的terminated state的value值 —— (Bootstrap returns from value estimates if episode is terminated by timeout)
本文主题:如何计算强化学习中被环境系统截断的terminated state的value值 首先解释一下什么是强化学习中的terminated state的value值,强化学习就是一个智能体(age ...
- docker REPOSITORY 改名
创建新的名称: docker tag oldname:tag newname:tag 删除旧的名称: docker rmi oldname:tag
- BIMFCE选择全量绘制
var webAppConfig = new Glodon.Bimface.Application.WebApplication3DConfig(); webAppConfig.domElement ...