> > Very interesting. > > So after the read of this explanation and the architecture and coding > implication of the usage of Hibernate my question stay the same .... > > Does the ORM approach based on a relational DB is the good way ? > The usage of a Document Oriented Database seem more in adequacy with > the problem to solve. > > No ?
I have to say I haven't dug much into Document DB. I simply took a look at key-value store and similar no-sql DB. I wonder how does this kind of DB do complicated search? Let's the VM is serialized as you said > > > *{* > > > * name: "myVM",* > > > * memory: 1024* > > > * network: [{eth0: 195.21.24.12}, {eth1: 12.35.15.28}**]* > > > * storage: [{local: [{sdb ....}]}]* > > > *}* > > > * How can I get the vm whose eth0=195.21.24.12? Does search relay on text search engine like Lucent? > > > > On Thu, Jun 28, 2012 at 8:32 PM, Frank Zhang <frank.zh...@citrix.com> > wrote: > > > Hi David: > > I think I can answer part of your question, about graph object. > > Actually CloudStack's database entity the xxxVO you see does > > have graph object, however it's not using the typical way which is > > well known as composition (e.g VMInstance.NetworkVO.NicVO), we use id > > which is the primary key in database to composite object graph. > > Current popular ORM, Hibernate or JPA, use one-to-many, > > many-to-one, many-to-many .... or new annotation(JPA2) like > > MapKeyJoinColumn to make object graph transparent just as you > mentioned. > > However, this doesn't fit CloudStack's requirement in terms of huge > > number of objects. > > ORM offers to two ways to fetch relational object: > > eagerly of lazy. The Eagerly mode definitely won't work for > > CloudStack, let me cite an example, assume we have a beautiful graph > object hierarchy: > > HostVO > > |___ VMInstanceVO[] > > |_________NicVO[] > > > > Now once you get a HostVO, you can transparently browse > > vms running on it and even get nic information of VM. However, it doesn't > work. > > Let's say you have 10000 hosts, each host run 10 ~ `50 VMs, each VM > > has 1 ~ 3 nics. With eager fetching, a listAllHost operation is going > > to blow up memory, there are half millions object loaded in memory and > > most of them are useless. > > > > Lazy mode seemingly resolve this problem, however, > > Hibernate and JPA only allow lazy load when your entity is still in > > persistence context, according to their saying, the object must be > > attached. This works pretty well in tradition web application, open > > the persistence context when request comes in and close it when > > request finishes. However, in CloudStack, a request like DeployVM is > > made up of multiple operations such as preparing storage, preparing > > network ... some of these operations (e.g. preparing storage) are long > > run, it's impossible to keep a persistence opening so long. And most > > of operations are based on theadpool where persistence context is hard > > to propagate because it's based on threadlocal. > > Well, one solution is recommended by hibernate, using detach to remove > > entity from persistence and attach it back when needs. IMO, this is a > > quite annoying way that brings much trouble to programmer. Let's say I > > write a function receiving an entity as parameter: > > Void printHost(HostVO vo) { > > printVMsonHost(vo.vms) > > } > > Can somebody tell me the HostVO is attached or detached now? > > no one knows. You have to call some function of persistence to judge > > if the HostVO is attached, if not, attach it back. Otherwise you will > > be greeted by a EntityIsNotManaged exception. It ends up with you have > > to do boring judge/attach at everywhere you play with entity object > > because you don't know if it is attached. Ok, even we don't mind it, > > the attach operation is quite annoying. JPA/Hibernate has a method > > "detach" entity, but they don't have the opposite method to 'attach' > > an entity. Simply google "jpa attach", there are tons of questions > > about proper way to re-attach an object back to persistence. The usual > > way is to call merge(), but it has the side effect that if you change > > the entity accidentally, your change would be written to database, this is > the source of mysterious bug. > > > > In CloudStack, you can use id(the primary key of relational > > object) to fetch your composition on demand, though it's not as > > intuitive as directly wiring whole relational object in code, it does > > its job well in practice. > > > > > -----Original Message----- > > > From: David Avenante [mailto:d.avena...@gmail.com] > > > Sent: Thursday, June 28, 2012 4:24 PM > > > To: cloudstack-dev@incubator.apache.org > > > Subject: Re: Hibernate > > > > > > Ok I try ;) > > > > > > As far I can see in the code the majority of the Object have no > > relations and > > > are simple VO > > > > > > Many of object use IMHO a bad pattern (DTO, VO ...) > > > > > > For example : > > > > > > public class UserVmVO extends VMInstanceVO implements UserVm { ... > > > > > > There is NO relation between objects. Object are State. > > > *The power of Hibernate is to try for the user to make transparent > > > the management of a graph object* *There is NO graph object in > > > Cloudstack as far I can see.* > > > * > > > * > > > *In the other side I think the Business Domain of the System > > > Management > > is > > > more document oriented.* *For exemple a VM can be represented by a > > > simple JSON structure:* > > > * > > > * > > > *{* > > > * name: "myVM",* > > > * memory: 1024* > > > * network: [{eth0: 195.21.24.12}, {eth1: 12.35.15.28}**]* > > > * storage: [{local: [{sdb ....}]}]* > > > *}* > > > * > > > * > > > *The force of the approach is to have a schema less support. If we > > > need > > to > > > add attribute to a VM no need to migrate de DB.* *In many case some > > > part of the document can be exposed in JSON format directly to the > > > view (UI).* > > > * > > > * > > > *We have used MongoDB in on of my project (we used hibernate before) > > > and the return in term of usage in very very good.* *In many many > > > case, > > see > > > the data as document is a big win.* > > > * > > > * > > > * > > > * > > > > > > > > > > > > > > > On Thu, Jun 28, 2012 at 5:53 PM, Kevin Kluge > > > <kevin.kl...@citrix.com> > > > wrote: > > > > > > > Rajesh, can you provide some rationale for this choice versus > > > > other options. > > > > > > > > -kevin > > > > > > > > > -----Original Message----- > > > > > From: Rajesh Battala [mailto:rajesh.batt...@citrix.com] > > > > > Sent: Wednesday, June 27, 2012 10:44 PM > > > > > To: cloudstack-dev@incubator.apache.org > > > > > Subject: RE: Hibernate > > > > > > > > > > Hi, > > > > > > > > > > I had started working on this issue. As Hibernate is LGPL we > > > > > cannot use > > > > this in > > > > > our Apache repo. > > > > > I had discussed with Chiradeep and Kelven. > > > > > > > > > > Am looking at replace Hibernate with Spring Framework > > > > > simpleJDBCTemplate. > > > > > > > > > > The Spring Framework is released under version 2.0 of the Apache > > > > > License http://www.springsource.org/spring-framework > > > > > > > > > > Thanks > > > > > Rajesh Battala > > > > > > > > > > > > > > > > -----Original Message----- > > > > > > From: Chiradeep Vittal [mailto:chiradeep.vit...@citrix.com] > > > > > > Sent: Thursday, June 28, 2012 10:45 AM > > > > > > To: cloudstack-dev@incubator.apache.org > > > > > > Cc: cloudstack-dev@incubator.apache.org > > > > > > Subject: Re: Hibernate > > > > > > > > > > > > The ORM in the AWS module is 90% used by S3. > > > > > > The dependency is mostly abstracted by a DAO layer; there is > > > > > > another dependency on transactions. I believe Rajesh B is > > > > > > already working on this aspect and there is a bug open on it. > > > > > > > > > > > > -- > > > > > > Chiradeep > > > > > > > > > > > > On Jun 27, 2012, at 21:52, "David Nalley" <da...@gnsa.us> wrote: > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > On Jun 28, 2012, at 12:45 AM, Sheng Liang > > > > > > > <sheng.li...@citrix.com> > > > > > > wrote: > > > > > > > > > > > > > >>> In short, I see three options (please comment if you see > > > > > > >>> more) > > 1. > > > > > > >>> Rip out > > > > > > hibernate and replace with some other ORM 2. Make the AWS API > > > > > > bits an optional non-default part of the build. > > > > > > >> 3. Declare that hibernate is a system requirement for > > > > > > >> CloudStack > > > > > > >> > > > > > > >> I prefer option #1. It is the cleanest. I don't think it > > > > > > >> will be very difficult to > > > > > > rip out Hibernate. > > > > > > >> > > > > > > >> Sheng > > > > > > > > > > > > > > > > > > > > > > > > > > > > That is my personal inclination as well, though I am > > > > > > > somewhat reticent to > > > > > > say so, since I am not doing any of the work to rip and replace. > > > > > > At the same time choice of ORM is a big issue. I know, for > > > > > > instance that Alex was looking into finding another ORM for > > > > > > the > > rest of > > > CloudStack. > > > > > > When I initially looked at the Hibernate issue, Prachi told me > > > > > > she thought it was about 2 weeks worth of work. > > > > > > > > > > > > > > > > > > > > > --David > > > > > >