我想在关系数据库(PostgreSQL)中保留一个对象。我不知道要持久化的对象的具体类,我只知道它实现了一个接口。
最好的方法是什么?
我正在考虑做类似的事情:
Interface obj = new InterfaceImpl();
ByteArrayOutputStream buffer = new ByteArrayOutputStream();
ObjectOutputStream oos = new ObjectOutputStream(buffer);
oos.writeObject(obj);
oos.close();
byte[] rawData = buffer.toByteArray();
String base64String = Base64.encodeBase64String(bytes);
//Persist the string to DB
//Load string from db
byte[] backToBytes = Base64.decodeBase64(base64String);
ByteArrayInputStream in = new ByteArrayInputStream(data);
ObjectInputStream is = new ObjectInputStream(in);
Interface obj = (Interface) is.readObject();
有更好的解决方案吗?
答案 0 :(得分:1)
如果你真的对这个对象了解多少,那么你所能做的就是将它存储在bytea
字段中,并在以后需要时再次检索它。
使用bytea
而不是text
。它对二进制数据更快(没有排序规则或自然语言支持),它支持存储零(空)字节,与text
不同。
这应该是在数据库中存储数据的绝对最后手段。 总是导致痛苦。有人会问,“好了,现在写一个查询,找到所有com.mycompany.Apple
类型的对象,其colour
属性设置为"red"
。你必须回复”抱歉,我不能这样做,数据库只看到一堆二进制乱码“。你会被告知”无论如何“。所以你从数据库中读出每个对象,反序列化它,检查它的类型,通过反射检查它的属性并丢弃它或根据结果保存它。数据库变大,这变得越来越慢。所以你开始添加列来缓存有关DB中对象的信息,但随后他们开始与存储的数据不同步,因为有些代码会忘记更新它们......
我编写了在bytea
字符串中查找的查询,以便手动反序列化并检查Java对象的部分内容。可怕的东西。不建议。
如果可以这样做,请使用对象结构的更实用的序列化,例如json
。当您不可避免地被要求这样做时,您可以从数据库中以实际方式查询。