显示导航

365bet地区多数据源

了解如何从365bet地区应用程序使用和处理对多个数据源的事务

s塞尔吉奥·德尔阿莫

365bet地区版本 4.0.1

训练

365bet地区培训由创建并积极维护365bet地区框架的人们开发和交付

入门

在本指南中,您将

您将需要什么

要完成本指南,您将需要以下内容

  • 花些时间在你手上

  • 体面的文本编辑器或IDE

  • 安装了JDK或更高版本JAVA首页适当配置

如何完成指南

要开始,请执行以下操作

要么

365bet地区指南存储库包含两个文件夹

  • 初始初始项目通常是一个简单的365bet地区应用程序,其中包含一些其他代码,可以帮助您快速入门

  • 完成一个完整的示例它是按照指南中介绍的步骤进行操作并将这些更改应用于文档的结果。初始

要完成指南,请转到初始

  • 光盘进入grails指南grails多数据源初始

并按照下一节中的说明进行操作

您可以直接前往完成的例子如果你光盘进入grails指南grails多数据源完成

编写申请

我们正在使用休息档案连接到两个数据源

图形
在早期版本的用于多个数据源的365bet地区中,尽力而为的事务链被用来尝试管理所有已配置数据源中的事务。从365bet地区开始,由于它是真正的XA实现,并且由于造成混乱,因此已被禁用,这会影响性能。每笔交易,对于每个数据源而言,都有一笔交易,无论是否实际需要

组态

连接两个数据源yml应用程序

grails应用配置会议应用yml
数据源:
    派对: 真正
    jmxExport: 真正
    driverClassNameorg h驱动程序用户名她的密码: ''
环境:
    发展:
        数据源:
            dbCreate创建放置网址: 数据库:H:记忆devDb MVCC真锁定超时10000DB退出时为假数据源:
            图书:
                dbCreate创建放置网址: 数据库:H:记忆bookDevDb MVCC真锁定超时10000DB退出时为假测试:
        数据源:
            dbCreate创建放置网址: 数据库:H:记忆testDb MVCC真锁定超时10000DB退出时为假数据源:
            图书:
                dbCreate创建放置网址: 数据库:H:记忆bookTestDb MVCC真锁定超时10000DB退出时为假

域类

创建一个电影域类如果我们不指定任何数据源,它将与默认数据源

365bet地区应用程序域演示Movie groovy
演示 电影 {
    标题静态的有很多关键字关键词

创建一个域类

365bet地区应用程序域演示书groovy
演示  {
    标题静态的有很多关键字关键词静态的映射数据源'图书' (1)
    }
}
1 域类与图书数据源

创建一个关键词域类

grails应用程序域演示关键字groovy
演示进口 org grails数据存储区映射核心连接ConnectionSource

 关键词 {
    那么静态的映射数据源ConnectionSource DEFAULT'图书']) (1)
    }
}
1 关键词域类与两个数据源dataSource的默认值和图书).

服务

创建一个数据服务对于电影域类

365bet地区应用程序服务演示MovieDataService groovy
演示进口 grails gorm服务加入
进口 grails gorm services服务
进口 常规转换CompileStatic

静态编译
服务电影接口MovieDataService虚空deleteByTitle标题加入('关键字') (1)
    清单找到所有
1 您可以使用来指定查询联接加入注解

添加常规服务

365bet地区应用程序服务演示MovieService groovy
演示进口 grails gorm交易ReadOnly
进口 grails gorm Transactions事务性
进口 常规转换CompileStatic
进口 groovy util日志记录Slf j

自我
静态编译
 电影服务 {

    交易性电影addMovie标题清单<关键字电影电影电影标题标题如果关键字对于 ( 关键字关键字电影addToKeywords关键词那么关键词如果电影保存日志错误'无法保存电影'电影
365bet地区应用服务演示BookDataService groovy
演示进口 grails gorm服务加入
进口 grails gorm services服务
进口 grails gorm交易ReadOnly
进口 grails gorm Transactions事务性
进口 常规转换CompileStatic

静态编译
服务()
接口BookDataService加入('关键字') (2)
    只读('图书') (1)
    清单<找到所有交易性('图书') (1)
    虚空deleteByTitle标题
1 在以下位置指定数据源名称交易性只读注解
2 您可以使用来指定查询联接加入注解
如果你用过只读代替唯读书籍你会得到例外org hibernate HibernateException没有找到当前线程的会话

添加常规服务

365bet地区应用服务演示BookService groovy
演示进口 grails gorm Transactions事务性
进口 常规转换CompileStatic

静态编译
 图书服务 {

    交易性('图书') (1)
    addBook标题清单<关键字 (标题标题如果关键字对于 ( 关键字关键字书addToKeywords关键词那么关键词如果图书保存日志错误'无法储存书籍'
1 在以下位置指定数据源名称交易性注解

添加一个关键词可以处理多个数据源的服务

当不使用显式命名空间时,在域类中指定的第一个数据源是默认值。关键词数据源ConnectionSource默认默认情况下使用第一个指定的

grails应用服务演示KeywordService groovy
演示进口 365bet地区 Gorm DetachedCriteria
进口 grails gorm交易ReadOnly
进口 常规转换CompileStatic

静态编译
 关键字服务 {

    只读('图书')
    清单findAllBooks关键字书籍查询列表只读
    清单findAllDefaultDataSourceKeywords defaultDataSourceQuery列表私人的分离标准booksQuery关键字,其中withConnection'图书') (1)
    }

    私人的分离标准defaultDataSource查询关键字,其中
1 用以下命令指定数据源名称withConnection查询

你可能已经写了图书使用动态查找程序或条件查询而不是在哪里查询.

哪里查询withConnection书籍清单中的关键字

动态取景器关键字书findAll

标准关键字书籍createCriteria清单

控制器

创建BookController电影控制器那些消费以前实施的服务

grails应用控制器演示SaveBookCommand groovy
演示进口 365bet地区grails编译器365bet地区CompileStatic
进口 grails验证有效

365bet地区365bet地区CompileStatic
 SaveBookCommand 实施有效期标题清单<关键字静态的约束标题可为空: 关键字可为空: 真正
    }
}
365bet地区应用控制器演示BookController groovy
演示进口 grails gorm Transactions事务性
进口 常规转换CompileStatic

静态编译
交易性
 BookController {

    静态的allowedMethods保存: '开机自检', 指数: '得到']

    静态的responseFormats'json'BookService bookService keywordService keywordService BookDataService bookDataService定义 保存SaveBook命令cmd bookService addBook cmd标题命令关键字渲染状态: 201
    }

    定义 指数() {
        [bookListbookDataService findAll定义 删除(标题bookDataService deleteByTitle标题呈现状态: 204
    }

    定义 关键字渲染视图: '关键字索引',
               模型: [keywordListkeywordService findAllBooksKeywords
grails应用控制器演示SaveBookCommand groovy
演示进口 365bet地区grails编译器365bet地区CompileStatic
进口 grails验证有效

365bet地区365bet地区CompileStatic
 SaveBookCommand 实施有效期标题清单<关键字静态的约束标题可为空: 关键字可为空: 真正
    }
}
365bet地区应用控制器演示MovieController groovy
演示进口 常规转换CompileStatic

静态编译
 电影控制器 {

    静态的allowedMethods保存: '开机自检', 指数: '得到']

    静态的responseFormats'json'MovieService movieService MovieDataService movieDataService KeywordService keywordService定义 保存SaveMovie命令cmd movieService addMovie cmd标题命令关键字render状态: 201
    }

    定义 指数() {
        [电影列表movieDataService findAll定义 删除(标题movieDataService deleteByTitle标题呈现状态: 204
    }

    定义 关键字渲染视图: '关键字索引',
               模型: [keywordListkeywordService findAllDefaultDataSourceKeywords

`

观看次数

添加多个JSON视图渲染输出

grails应用程序意见书book gson
进口 示范书模型书json标题书标题关键字书关键字名称唯一排序
365bet地区应用程式浏览量书籍索引gson
进口 示范书模型可迭代的<bookList json tmpl图书bookList
grails应用程式观看电影电影gson
进口 演示电影模型电影电影json标题电影标题关键字电影关键字名称唯一排序
grails应用程式观看电影索引gson
进口 演示电影模型可迭代的movieList json tmpl电影movieList
365bet地区应用程序视图关键字索引gson
进口 演示关键字模型可迭代的keywordList json关键字keywordList名称唯一排序

功能测试

micronaut http客户端作为一个测试编译依赖

建立gradle
测试编译"io micronaut micronaut http客户端"

添加功能测试以验证365bet地区是否可以按预期处理多个数据源

src集成测试groovy演示MultipleDataSourceSpec groovy
演示进口 grails测试mixin集成集成
进口 365bet地区测试Spock一次
进口 Micronaut核心类型参数
进口 io micronaut http HttpRequest
进口 io micronaut http HttpResponse
进口 io micronaut http HttpStatus
进口 io micronaut http客户端HttpClient
进口 spock lang共享
进口 spock lang规格

积分
 MultipleDataSourceSpec 延伸规格共享HttpClient客户端之前
    虚空在里面的baseUrl"HTTP本地主机$服务器端口"
        这个HttpClient的客户创造的baseUrl的toURL私人的HttpResponse地图大量资源资源itemTitle清单<itemKeywords HttpRequest请求HttpRequest POST"/$资源", [标题itemTitle关键字itemKeywords客户端到阻止交换请求地图)
    }

    私人的HttpResponse deleteResource资源itemTitle HttpRequest请求HttpRequest删除"/$资源", [标题itemTitle客户端阻止交换请求私人的HttpResponse清单<地图获取资源资源HttpRequest请求HttpRequest GET"/$资源"客户对阻止交换请求的争论清单, 地图))
    }

    私人的HttpResponse地图resourceKeywords资源HttpRequest请求HttpRequest GET"/$资源关键字"客户阻止交换请求地图)
    }

    定义 "测试多数据源支持保存和检索书籍和电影"() {
        给定:
        清单<地图图书标题: '变更代理', 标签: ['痛风', '科幻']],
                [标题: '涌入', 标签: ['科幻']],
                [标题: '杀死决定', 标签: ['无人驾驶飞机', '科幻']],
                [标题: '自由TM', 标签: ['科幻']],
                [标题: '守护进程', 标签: ['科幻']],
        ]
        清单<地图电影标题: '硅谷海盗', 标签: ['苹果', '微软', '技术']],
                [标题: '起始时间', 标签: ['科幻'图书每本书HttpResponse地图分别保存''书名 书本标签 清单<>)
            断言状态状态HttpStatus创建的电影每部电影HttpResponse地图分别保存'电影'电影标题 电影标签 清单<>)
            断言resp status HttpStatus已创建什么时候HttpResponse清单<地图resourceResp fetchResource'')

        然后resourceResp状态HttpStatus OK resourceResp主体收集书名排序书集标题排序什么时候resourceResp fetchResource'电影')

        然后resourceResp状态HttpStatus OK resourceResp主体收集标题排序电影收集标题排序什么时候HttpResponse地图resp resourceKeywords'')

        然后resp status HttpStatus OK resp body关键字 清单<整理书籍收集标签扁平化唯一排序什么时候resp resourceKeywords'电影')

        然后resp status HttpStatus OK resp body关键字 清单<排序电影收集标签扁平化唯一排序清理书每本书断言deleteResource''书名 状态HttpStatus NO CONTENT电影每部电影断言deleteResource'电影'电影标题 状态HttpStatus没有内容

测试应用程序

运行测试

grailsw grails测试应用程序grails打开测试报告

要么

gradlew检查打开构建报告测试索引html

帮助365bet地区

OCI赞助了本指南的创建OCI提供了几种365bet地区服务:

免费咨询

OCI 365bet地区团队包括365bet地区联合创始人Jeff Scott Brown和Graeme Rocher检查我们的365bet地区课程并向发展和维护365bet地区的工程师学习

Grails OCI团队