在数据库

时间:2015-11-06 21:53:22

标签: java postgresql serialization persistence

我想在关系数据库(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();

有更好的解决方案吗?

1 个答案:

答案 0 :(得分:1)

如果你真的对这个对象了解多少,那么你所能做的就是将它存储在bytea字段中,并在以后需要时再次检索它。

使用bytea而不是text。它对二进制数据更快(没有排序规则或自然语言支持),它支持存储零(空)字节,与text不同。

这应该是在数据库中存储数据的绝对最后手段。 总是导致痛苦。有人会问,“好了,现在写一个查询,找到所有com.mycompany.Apple类型的对象,其colour属性设置为"red"。你必须回复”抱歉,我不能这样做,数据库只看到一堆二进制乱码“。你会被告知”无论如何“。所以你从数据库中读出每个对象,反序列化它,检查它的类型,通过反射检查它的属性并丢弃它或根据结果保存它。数据库变大,这变得越来越慢。所以你开始添加列来缓存有关DB中对象的信息,但随后他们开始与存储的数据不同步,因为有些代码会忘记更新它们......

我编写了在bytea字符串中查找的查询,以便手动反序列化并检查Java对象的部分内容。可怕的东西。不建议。

如果可以这样做,请使用对象结构的更实用的序列化,例如json。当您不可避免地被要求这样做时,您可以从数据库中以实际方式查询。