最新的DB2程序临时修订(PTF)组(用于7.1的SF99701和用于7.2的SF99702)在与IBM i 7.1的Technology Refresh 10和IBM i 7.2的Technology Refresh 2相同的日期发布,其中包括JSON Store Technology Preview。 这项新功能允许使用DB2 for i数据库表存储和检索JSON文档。 此功能增加了JSON支持,该支持与为Linux,UNIX和Windows的DB2和针对z / OS的DB2添加的支持相当。 IBM i上的JSON支持包括对DB2 JSON命令行处理器和DB2 JSON Java API的支持。 本文的目的是描述IBM i上的JSON功能,并向读者介绍其他包含更多详细信息的IBMdeveloperWorks®文章。 JSON Store技术功能仅由developerWorks文章描述。
正如DB2 JSON功能(第1部分:DB2 JSON简介)中所述,JSON是一种轻量级的格式,用于交换信息。 JSON文档很容易由Web浏览器上运行JavaScript程序创建和使用。 由于其简单的结构,JSON已成为Web应用程序信息交换的常用方法。 它之所以受欢迎是因为它比XML的替代方法要轻得多。 第1部分文章中介绍了有关JSON及其优点的更多详细信息。
有三种方法可以在IBM i上使用JSON。
db2nosql-DB2 JSON命令行处理器 DB2 JSON Java API SYSTOOLS.BSON2JSON-检索存储在DB2 for i表中的JSON文档的功能。在DB2 for i中存储JSON文档可提供出色的可靠性和可用性。 DB2 JSON存储不包括查询引擎索引支持,也不支持使用SQL语句分解和发布JSON。
DB2 JSON命令行处理器包含在集成文件系统中的IBM i中。 包含处理器的完整IFS路径名是/ QIBM / ProdData / OS / SQLLIB / bin / db2nosql。 在IBM i上,从IBM i QSHELL环境中使用DB2 JSON命令行处理器。 要进入QSHELL环境,请运行“ Start QSHELL (STRQSH)命令。
通过从/ QIBM / ProdData / OS / SQLLIB / bin目录下载以下文件,也可以在客户机系统上使用DB2 JSON命令行处理器。
db2nosql db2nosql.bat jline-0.9.93.jar js.jar mongo-2.8.0.jar nosqljson.jar servlet-api.jar您还需要获取jt400.jar文件的版本,该文件可以在/ QIBM / ProdData / os400 / jt400 / lib / java6目录中找到。 将这些文件放在客户机上的相同目录中,然后运行db2nosql(在UNIX系统上)或db2nosql.bat(在Windows系统上)以启动命令行处理器。 设置Microsoft®Windows®系统(安装了FTP)的一种简单方法是启动Windows命令提示符并运行以下命令,其中MYIBMI是IBM i分区的名称。
要在IBM i上使用命令行处理器,请使用STRQSH启动QSHELL并运行/ QIBM / ProdData / OS / SQLLIB / bin / db2nosql。 在IBM i上使用时,命令行处理器使用本机JDBC驱动程序使用当前用户的凭证连接到当前分区。 如果需要使用其他用户的凭据进行连接,则可以使用db2nosql的–user和–password参数指定这些凭据,如以下示例所示。
可以在客户机系统上使用db2nosql命令来与DB2 for i中的JSON数据交互工作。 使用-hostname或-url参数指定目标IBM i分区,其中URL是JDBC样式的URL。 对于IBM i,JDBC URL必须采用jdbc:as400:partitionName的形式。 以下示例使用这些选项,分区名称为MYIBMI 。
注意 : db2nosql要求在命令路径上提供Java版本。 使用的Java版本至少应为Java 6。
在IBM i分区上使用JSON之前,必须执行一次性设置。 这是通过使用-setup enable选项运行db2nosql来完成的,如以下示例所示。 每个IBM i分区仅需要执行一次此设置。
在IBM i上,JSON文档是使用DB2 for i表的二进制大对象(BLOB)列存储的。 如果使用承诺控制,则IBM i要求在使用这些表时激活日记功能。 为了确保满足此条件,建议在SQL模式中创建JSON集合,这会自动激活模式中表的日记功能。 使用“ CREATE SCHEMA” SQL语句创建一个SQL模式。 在IBM i库中使用JSON集合而不进行日志记录会导致SQL7008“文件对操作无效”,这是使用承诺控制来操作这些表时发生的错误。
有关使用db2nosql的详细信息,请参阅DB2 JSON功能,第2部分:使用命令行处理器 developerWorks文章。 在当前的文章中,我们提供了在IBM i上使用db2nosql可以实现的示例。
任何JSON 集合都映射到单个DB2 for i表。 该表位于JSON使用的任何模式中,并且专用于仅包含JSON文档。 要指定当前模式,请use db2nosql use命令。 例如,以下命令使db2nosql使用JSONLIB模式。
nosql>use JSONLIB CDJSN1214I Switched to schema: "JSONLIB"如上所述,该架构应该是使用CREATE SCHEMA SQL语句创建的架构。 如果尚未创建模式,则可以使用db.sqlUpdate()命令运行CREATE SCHEMA SQL语句。 这是一个使用db2nosql创建JSONLIB模式然后使用它的示例。
您可以使用db命令查看有关当前数据库的信息。
nosql>db Database: jdbc:db2:localhost Schema: JSONLIB为了存储JSON文档,必须存在一个JSON集合以包含这些文档。 JSON集合使用DB2 for i表存储JSON文档。 该表的唯一目的是容纳db2nosql或DB2 Java JSON API访问的JSON文档。 包含JSON集合的表包含名为ID和DATA的两列。 ID列包含插入表中的JSON文档的唯一标识符。 DATA列是一个BLOB列,其中包含JSON文档[以二进制JSON(BSON)格式表示]。 JSON文档的最大大小约为16兆字节(MB)。
创建集合的一种方法是使用db.createCollection()命令。 在JSON中,JSON集合名称区分大小写。 如果在创建集合时使用小写字母,那么将在IBM i上使用分隔名称创建表。 如果您不希望在模式中使用分隔表名,则应使用大写名称创建JSON集合。 以下命令创建JSON集合: JSONA和jsonb 。
创建JSONA和jsonb集合之后,我们可以检查IBM i上JSONLIB库的内容。 我们看到使用小写或大小写混合的JSON集合名称的影响,因为jsonb创建为带有分隔名称的FILE对象。
因为DB2 for i表名称限制为128个字符,所以如果JSON集合名称仅由大写字母组成,则限制为128个字符,如果需要定界,则限制为126个字符。
创建JSON集合后,可以使用db.插入文档db. <collectionName> .insert( <document> )命令。 如果该集合不存在,则insert命令将隐式创建该集合。 由于这种行为,没有必要使用前面描述的createCollection命令。 这是将简单的JSON文档插入JSONA集合的示例。
由于JSON文档已转换为二进制格式,因此将对其进行检查以确保它是有效数据。 尝试插入无效的JSON文档会导致出现错误,如下例所示。
将文档插入JSON集合后,您可以使用db.检索它们db. <collectionName> .find()命令。 调用不带任何参数的find命令将从集合中检索所有文档,如以下示例所示。
find命令也可以与搜索选项一起使用。 有关更多详细信息,请参阅第2部分。 以下是查找先前插入的文档的示例。
第2部分的文章还描述了用于查询,更新,聚合和管理JSON数据的其他选项。 第2部分中介绍的许多功能当前在IBM i上不可用。 当前不支持双向功能和时间旅行查询。 当前不支持使用索引。 同样,在sort() skip()操作之后使用任何limit()或skip()操作都不会产生预期的结果,因为limit()和skip()操作在内部应用于无序数据。
JSON Store Technology Preview还包括一个JSON Java API,该API可通过编程方式与DB2 for i中存储的JSON文档一起使用。 您可以在developerWorks文章DB2 JSON功能,第3部分:使用Java API编写应用程序中找到有关JSON Java API的详细信息。 本文包含一个示例Java程序 ,该程序说明了Java API的某些功能。
Java API可以在上面引用的nosqljson.jar文件的com.ibm.nosql.json.api包中找到。 Java API包括以下主要对象:DB对象,DBCollection对象,DBBasicObject对象和DBCursor对象。
JSON DB对象代表JSON数据库,并且对应于IBM i分区上的SCHEMA。 如以下示例程序所示,可以通过将JDBC连接和SCHEMA名称传递给NoSQLClient.getDB()方法来获取DB对象。
也可以通过使用JDBC URL,用户ID和密码而不是JDBC连接来获取DB对象。
// Alternatively, you can get a DB using the JDBC url db = NoSQLClient.getDB(url, userid, password, schema);DB对象可用于运行SQL语句。 本文的示例程序使用sqlUpdate()方法运行两个SQL语句。 第一条语句确保SCHEMA存在。 第二条语句删除程序将用于存储JSON文档的表的内容。
db.sqlUpdate("CREATE SCHEMA "+schemaName); db.sqlUpdate("DELETE FROM "+schemaName+".JSONSAMPLE");DBCollection对象表示JSON文档的集合。 它是使用getCollection()方法从数据库对象中获取的。 在以下示例代码中,DB2 for i表JSONSAMPLE是getCollection()方法的目标。
DBCollection col = db.getCollection("JSONSAMPLE");当第一个项目插入JSON集合时,将创建用于保存JSON集合的表。 要将项目插入集合,请使用insert()方法。 以下示例将JSON文档插入到集合中。
一个DBBasicObject包含一个JSON文档。 它可用于以编程方式构建JSON文档,然后将其插入JSON集合中。 要构建JSON文档,只需创建一个DBBasicObject对象,然后使用append方法将元素添加到文档中。 以下示例说明了JSON文档的构建并将其插入JSON集合中。
DBCursor对象用于从JSON集合返回JSON文档。 DBCursor对象由DBCursor的find()方法DBCollection 。 可以使用hasNext()和next()方法访问DBCursor对象的元素,如以下示例所示。
您可以使用find()命令指定要查找的文档。 可以使用JSON值(作为字符串传递)或DBBasicObject对象传递find()命令来完成此操作,如以下示例所示。
您可以在第3部分中找到有关此对象的更多详细信息。 另外,请参考Javadoc以获得Java API 。 当引用第3部分文章时,本文db2nosql部分中指定的限制也适用-特别是,不能在JSON集合上创建索引。
注意:缺乏索引支持会导致对JSON集合的查询在没有索引优化的情况下运行。
JSON Java API还可以使用SQL查询生成简单的JSON文档。 这些简单的JSON文档不包含JSON数组或嵌套的JSON文档。 为此,只需使用数据库对象的sqlQueryMethod()即可运行SQL查询。 这将返回一个DBCursor对象,其中包含代表查询结果行的DBObject对象。 每个DBObject对象代表一个JSON文档,其中包含由列名和列值组成的元素。 这是一个使用这种方法的代码示例,该示例从SYSTOOLS.SYSJSON_INDEX表中查询名为SCHEMA和COL的两列。 SYSTOOLS.SYSJSON_INDEX表是DB2 JSON支持人员用来跟踪IBM i上存在的JSON集合(即表)的表。
运行此代码示例时,将显示以下输出。 在此,SCHEMA和COL是查询中指定的列名,而JSONLIB和JSONSAMPLE是查询返回的那些列的值。
Retrieved: {"SCHEMA":"JSONLIB","COL":"JSONSAMPLE"}此功能使Java程序能够根据SQL查询轻松创建JSON文档。
JSON存储技术预览版包括一个用户定义函数(UDF),该函数可用于将JSON文档从其内部二进制形式转换为其字符形式。 SYSTOOLS.BSON2JSON UDF可用于以JSON形式检索BSON文档的内容。 如上所述,JSON文档以BSON格式存储在表示JSON集合的表的DATA列中。 这是使用此UDF查看表中JSON的示例。
由于BSON2JSON UDF会生成CLOB,因此当STRSQL运行查询时,将显示以下输出。
BSON2JSON *POINTER *POINTER ******** End of data ********要解决此问题,请将生成的CLOB强制转换为VARCHAR,如以下示例所示。
或者更好的是,使用现代化的战略界面运行交互式SQL语句。 从System i Navigator运行SQL脚本。 请参阅IBM i Access页面以获取更多详细信息。 该首选界面将带来更好的用户体验。
您可以在DB2 z / OS版的文档中找到有关SYSTOOLS.BSON2JSON UDF的更多信息。
提醒一下,IBM i上的JSON当前不支持其他developerWorks文章中提到的以下功能。 不支持任何时间功能。 不支持在JSON文档上创建索引。 developerWorks文章提到了有线侦听器。 有线侦听器不包含在IBM i JSON支持中。
本文介绍了IBM i的JSON存储技术预览。 使用DB2 JSON命令行启用JSON支持后,将使用DB2 JSON命令行和DB2 JSON Java API从DB2 for i表插入和检索JSON文档。 DB2 JSON Java API也可以用于从SQL查询构造一个简单的JSON文档。 最后,可以在SQL查询中使用SYSTOOLS.BSON2JSON UDF来查看存储在DB2 for i表中的JSON文档。
翻译自: https://www.ibm.com/developerworks/ibmi/library/i-json-store-technology/index.html