显示导航

365bet地区365bet地区多数据源

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

s塞尔吉奥·德尔阿莫

365bet地区版本 3.3.1

训练

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

入门

在本指南中,您将

您将需要什么

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

  • 花些时间在你手上

  • 体面的文本编辑器或IDE

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

如何完成指南

要开始,请执行以下操作

要么

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

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

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

要完成指南,请转到初始

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

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

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

编写申请

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

图形
365bet地区在早期版本的用于多个数据源的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 您可以使用来指定查询联接加入注解
如果你用过只读代替唯读书籍你会得到例外org hibernate HibernateException没有找到当前线程的会话

添加常规服务

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 您可以使用来指定查询联接加入注解

添加常规服务

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
演示进口 grails编译器365bet地区CompileStatic
进口 grails验证有效

365bet地区365bet地区CompileStatic
 SaveBookCommand 实施有效期标题清单<关键字静态的约束标题可为空: 关键字可为空: 真正
    }
}
365bet地区应用控制器演示BookController groovy
演示进口 常规转换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
演示进口 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标题命令关键字渲染状态: 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名称唯一排序

功能测试

365bet地区数据存储其余客户端作为一个测试编译依赖

建立gradle
测试编译"组织grails grails数据存储区其余客户端"

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

src集成测试groovy演示MultipleDataSourceSpec groovy
演示进口 grails插件rest client RestBuilder
进口 grails插件其余客户端RestResponse
进口 grails测试mixin集成集成
进口 spock lang共享
进口 spock lang规格

积分
 MultipleDataSourceSpec 延伸规格共享RestBuilder的休息RestBuilder的私人的RestResponse saveResource资源itemTitle清单<itemKeywords其余帖子"HTTP本地主机${服务器端口}/${资源}"接受'应用程序json'内容类型'应用程序json'json标题itemTitle关键字itemKeywords私人的RestResponse deleteResource资源itemTitle其余删除"HTTP本地主机${服务器端口}/${资源}"接受'应用程序json'内容类型'应用程序json'json标题itemTitle私人的RestResponse fetchResource资源休息得到"HTTP本地主机${服务器端口}/${资源}"接受'应用程序json')
        }
    }

    私人的RestResponse resourceKeywords资源休息得到"HTTP本地主机${服务器端口}/${资源}关键字"接受'应用程序json')
        }
    }

    定义 "测试多数据源支持保存和检索书籍和电影"() {
        什么时候RestResponse响应saveResource'', '变更代理', ['痛风', '科幻'])

        然后分别显示statusCode值201

        什么时候分别保存'', '涌入', ['科幻'])

        然后分别显示statusCode值201

        什么时候分别保存'', '杀死决定', ['无人驾驶飞机', '科幻'])

        然后分别显示statusCode值201

        什么时候分别保存'', '自由TM', ['科幻'])

        然后分别显示statusCode值201

        什么时候分别保存'', '守护进程', ['科幻'])

        然后分别显示statusCode值201

        什么时候分别保存'电影', '硅谷海盗', ['苹果', '微软', '技术'])

        然后分别显示statusCode值201

        什么时候分别保存'电影', '起始时间', ['科幻'])

        然后分别显示statusCode值201

        什么时候分别获取'')

        然后分别显示statusCode值200响应JSON收集标题排序'变更代理', '守护进程', '自由TM', '涌入', '杀死决定']

        什么时候分别获取'电影')

        然后分别显示statusCode值200响应JSON收集标题排序'起始时间', '硅谷海盗']

        什么时候resp resourceKeywords'')

        然后分别显示statusCode值200响应json关键字'痛风', '无人驾驶飞机', '科幻']

        什么时候resp resourceKeywords'电影')

        然后分别显示statusCode值200响应json关键字'苹果', '微软', '科幻', '技术']

        什么时候分别删除'', '变更代理')

        然后分别显示statusCode值204

        什么时候分别删除'', '涌入')

        然后分别显示statusCode值204

        什么时候分别删除'', '杀死决定')

        然后分别显示statusCode值204

        什么时候分别删除'', '自由TM')

        然后分别显示statusCode值204

        什么时候分别删除'', '守护进程')

        然后分别显示statusCode值204

        什么时候分别删除'电影', '硅谷海盗')

        然后分别显示statusCode值204

        什么时候分别删除'电影', '起始时间')

        然后分别显示statusCode值204
    }
}

测试应用程序

运行测试

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

要么

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

帮助365bet地区

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

免费咨询

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

Grails OCI团队