我使用jruby和postgres作为db运行rails4。我有一个jar文件,我调用它来创建一个java对象的实例。 java对象是到另一台机器上的后端计算引擎的桥梁。它查询计算引擎并将返回值存储为实例变量。我需要在每个会话中保留此对象的唯一实例。是否可以在postgres中存储java对象的实例?我真的不知道从哪里开始这个并且看谷歌没有帮助所以任何建议都表示赞赏。感谢。
答案 0 :(得分:0)
是否可以在postgres中存储java对象的实例?
是的,但这通常是一个坏主意。
如果您真的想这样做,可以使用Java's serialization framework获取对象的byte[]
表示,然后可以将其存储在PostgreSQL数据库的bytea
字段中PgJDBC。我确信Rails也有一些处理二进制数据的机制,所以如果你喜欢通过Rails这样做,请查看。
如果这个对象没有任何逻辑,如果它只是一堆实例变量而没有有趣的方法可以对它们进行操作,那么你应该将对象映射到关系中的字段,这样就节省了每个实例变量作为字段。然后提供构造函数来执行相反的操作。
另一种方法是将其序列化为标准格式,如json
,并将存储在数据库中。提供对象toJson
和fromJson
方法以手动执行此操作,或使用JAXB对其进行序列化/反序列化。 (JAXB通常使用XML,您可以使用它,或者您可以使用插件添加JSON支持)。
如果对象是"业务对象",即它管理其数据并具有逻辑和规则,那么您可能需要考虑远程访问。
在传统的Java世界中,您可以使用远程处理来执行此操作,您可以通过将实例包装在EJB3中并透明地生成EJB3客户端存根来对主机上运行的实例执行远程过程调用。跟它说话。
更现代(IMO)和更简单的编写(虽然使用更冗长)方法是使用JAX-RS提供一个简单的Web服务接口,您可以使用它来远程与对象进行通信。
答案 1 :(得分:0)
你已经提到了解决方案......如果每个会话需要一个唯一的对象
...最简单的事情就是简单地将一个与会话相关联,因为你在Rails中可能最好的办法就是使用Java会话切换(假设你在Java服务器上),例如用JRuby-Rack表示config.session_store = :java_servlet_store
只需执行session[:calculator] ||= MyJavaCalculator.new
即可。