我在PostgreSQL数据库列中有以下形式的json数据:
myData [{"key1": "value1", "key2": "value2"}, {"key1": "value1", "key2": "value2"} ]
其中myData
是包含两个对象的数组。
我阅读以下链接只用java来解决我的问题,但我的问题略有不同。
Converting JSON to Java和
Parsing JSON Object in Java
提取数据库中的键/值对(postgresql)会更有效吗?还是应该在java中获取整个字符串并使用java库?是否可以在数据库中进行?
如果在数据库中执行此操作是一个选项,JOOQ是否为此提供任何支持?
如果在Java中解析是更好的选择,上面链接中给出的两个库中哪一个更稳定/更有效? org.json或Gson
答案 0 :(得分:3)
这里有几个有趣的问题。
取决于。首先,在PostgreSQL中,jsonb
具有更好的索引支持。我不是这个主题的专家,但我很确定一旦你对1-2事情进行基准测试你会得出这个结论。这是一篇有趣的博客文章,比较了PostgreSQL中性能的不同数据类型:
http://www.databasesoup.com/2015/01/tag-all-things.html
...这让我想到了是否将谓词放入SQL查询中,或者稍后在Java中执行它们。一般来说:把它放在数据库中。如果您的谓词非常有选择性,那么您可以:
这两者都会导致查询延迟大大降低。如果你的谓词不是很有选择性,那么除了极端负载之外,这几乎不是问题。但是,如果您的系统处于极端负载且谓词 具有选择性,那么如果在数据库中运行谓词,您仍将大大减少该负载。
jOOQ目前不提供对JSON(B)谓词的任何开箱即用支持,但您可以使用jOOQ的纯SQL支持轻松构建实用程序:
http://www.jooq.org/doc/latest/manual/sql-building/plain-sql
实质上,只需写下:
public static Condition someJsonPredicate(Field<?> someJsonColumn, String someValue) {
return DSL.condition("some_json_predicate({0}, {1})",
someJsonColumn, DSL.val(someValue));
}
我不会在这里回答这一部分,因为你的基准可能与我的不同。
答案 1 :(得分:0)
从 Java PostgreSQL 数据库中获取 JSON 数据的解决方案。
PostgreSQL JSON(以文本形式存储)和 JSONB(以二进制形式存储)的比较
JSON | JSONB |
---|---|
以文本格式存储数据 | 以分解的二进制格式存储数据 |
输入很快,因为不需要转换 | 输入速度稍慢,因为存在与二进制转换相关的开销 |
处理函数必须在每次执行时重新解析数据 | 无需重新解析,显着加快数据处理 |
输入中的所有空格和换行符都保持原样 | 多余的空格和换行符被去除 |
不支持索引 | 支持索引 |
保留重复键,处理函数只考虑最后一个值 | 输入时清除重复键,只存储最后一个值 |
键的顺序被保留 | 不保留订单 |
数据库结构
my_table
id = PK
json_column = JSON or BYTEA
json_column 的数据示例
{"customer_name": "John", "items": { "description": "milk", "quantity": 4 } }
{"customer_name": "Susan", "items": { "description": "bread", "quantity": 2 } }
<块引用>
JAVA 解析 json (bof bof...)
String sql = "select json_column from my_table";
Statement stmt = conn.createStatement(...);
ResultSet rs = stmt.executeQuery(sql);
while(rs.next()) {
// Not really true as data are store in binary, not nice to parse it in string here...
JSONObject json = new JSONObject(rs.getString(1));
JSONObject json2 = (JSONObject)json.get("items");
System.out.println(json.get("customer_name"));
System.out.println(json2.get("quantity"));
}
<块引用>
PostgreSQL(喜欢这部分!)
select json_column->'customer_name' from my_table
select json_column->'items'->'quantity' from my_table
<块引用>
两者(非常好的解决方案)
sql = "select json_column->'items'->'quantity' from my_table";
ps = conn.prepareStatement(sql);
rs = ps.executeQuery();
while(rs.next()) {
rs.getInt(1);
...
}