tomee-users mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Dain Sundstrom <d...@iq80.com>
Subject Re: Configuring DataSources in a managed environment
Date Mon, 17 Dec 2007 21:26:15 GMT
I'd start by putting every thing in a single jar with a  
persistence.xml.  Once you get that working, then you can attempt to  
split it up.

As for actually splitting it up, I think there are two ways to go  
about it, although I've never tried either.

1) One persistence-unit with code spread amongst several dependent  
jars.  I'm not sure if OpenJPA will scan the whole class path or just  
the one jar containing the persistence.xml file, so you may have to  
explicitly list your persistent classes in the persistence.xml file.

2) Multiple persistence-units.  This will only work if the multiple  
units are island meaning they don't have relationships between  
entities in separate units.

I think the one persistence-unit option will be the best, as keeping  
to one persistence-unit means you have one JPA instance managing  
everything.  This way guarantees you only get one cache and one  
database connection used.  In OpenEJB we have code to detect multiple  
connections to the same database in one transaction and coalesce them  
into a single connection, but not all JEE servers do this.  If you do  
end up with multiple database connections, you will need a database  
that supports XA transactions (last time I checked mySQL didn't).  It  
is possible that a smart JPA implementation will recognize that is  
has two persistence-units to the same database and automagically  
configures itself to use a single DB connection, but I wouldn't count  
on it from any implementation except OpenJPA.

Anyway, I'd sick everything in one unit and optimize the packaging at  
the end of development.

-dain

On Dec 17, 2007, at 7:19 AM, Alexander Saint Croix wrote:

> Thanks for the help, David.
>
> I broke up the component library to make it modular, as there are  
> presently
> between 70-100 entities total.  I'm really REALLY not interested in
> combining those JARs, and have been operating on a couple of  
> assumptions
> about persistence units and how they must be packaged.
>
> I thought that each component JAR needed to include its own  
> persistence.xmlfile.
>
> The spec says:
>
>> A persistence unit may be packaged within one or more jar files  
>> contained
>> within a WAR
>>
>
> But also:
>
>> Only one persistence unit of any given name may be defined
>> within a single EJB-JAR file, within a single WAR file, within a  
>> single
>> application client jar, or within
>> an EAR (in the EAR root or lib directory).
>>
>
> Do my component JARs need to have persistence.xml files at all?   
> None of
> them are the root of the persistence unit--that seems to be the WAR.
> Shouldn't I define the persistence.xml file in the web app and  
> reference the
> JARs from there?  It would certainly simplify matters.
>
> Also, in which file do I configure my DataSource in embedded OpenEJB?
>
> Regards,
> --
> Alex
>
>
>
>
>
> On Dec 17, 2007 2:13 AM, David Blevins <david.blevins@visi.com> wrote:
>
>> On Dec 16, 2007, at 10:32 PM, Alexander Saint Croix wrote:
>>
>>> I am deploying in an embedded OpenEJB environment in Tomcat.
>>
>>
>>>    ...
>>>        // inside of the doGet(...) method:
>>>
>>>        FirstEntity ent1 = new FirstEntity();
>>>        ent1.setName("Entity name");
>>>        ent1.setDescription("Entity description");
>>>        ent1.setType("Entity type");
>>>
>>>        mgr.persist(ent1);
>>>
>>>        SecondEntity ent2 = new SecondEntity();
>>>        ent2.setName("Entity name 2");
>>>        ent2.setDescription("Entity description 2");
>>>        ent2.setSecondType("Entity type 2");
>>>
>>>        mgr.persist(ent2);
>>
>>
>>> @Stateless
>>> public class DefaultBeanManager implements BeanManager {
>>>
>>>    @PersistenceUnit(unitName="corm-base")
>>>    EntityManagerFactory emf;
>>>
>>>    @PersistenceUnit(unitName="corm-party")
>>>    EntityManagerFactory emf2;
>>>
>>>    public void persist(FirstEntity a) {
>>>
>>>        System.setProperty("openjpa.ConnectionDriverName", "
>>> com.mysql.jdbc.Driver");
>>>        System.setProperty("openjpa.ConnectionURL",
>>> "jdbc:mysql://localhost/corm");
>>>        System.setProperty("openjpa.jdbc.SynchronizeMappings",
>>> "buildSchema");
>>>        System.setProperty("openjpa.ConnectionUserName", "root");
>>>        System.setProperty("openjpa.ConnectionPassword",
>>> "n00p455wyrd");
>>>
>>>        EntityManager em = emf.createEntityManager();
>>>        em.getTransaction().begin();
>>>        em.persist(a);
>>>        em.getTransaction().commit();
>>>        em.close();
>>>
>>>    }
>>>
>>>    public void persist(SecondEntity a) {
>>>
>>>        System.setProperty("openjpa.ConnectionDriverName", "
>>> com.mysql.jdbc.Driver");
>>>        System.setProperty("openjpa.ConnectionURL",
>>> "jdbc:mysql://localhost/corm");
>>>        System.setProperty("openjpa.jdbc.SynchronizeMappings",
>>> "buildSchema");
>>>        System.setProperty("openjpa.ConnectionUserName", "root");
>>>        System.setProperty("openjpa.ConnectionPassword",
>>> "n00p455wyrd");
>>>
>>>        EntityManager em = emf2.createEntityManager();
>>>        em.getTransaction().begin();
>>>        em.persist(a);
>>>        em.getTransaction().commit();
>>>        em.close();
>>>    }
>>> }
>>
>>
>>> <persistence xmlns="http://java.sun.com/xml/ns/persistence"
>>> version="1.0">
>>>    <persistence-unit name="corm-party" transaction-
>>> type="RESOURCE_LOCAL">
>>>    </persistence-unit>
>>> </persistence>
>>>
>>> How should I correctly configure the ConnectionDriverName  
>>> property for
>>> multiple persistence units so that these component jars can  
>>> cooperate?
>>
>> Definitely do not set ConnectionDriverName at all, likewise for  
>> any of
>> the OpenJPA properties that smell of "let us make the datasource for
>> you".  You need to configure your datasource in Tomcat or OpenEJB
>> (either is fine as we sync the environments together), then you  
>> *must*
>> either a) set these two system properties:
>>
>>  javax.persistence.jtaDataSource=java:openejb/Resource/myDataSource
>>  javax.persistence.nonJtaDataSource=java:openejb/Resource/
>> myNonJtaDataSource
>>
>> or b) set them in each persistence.xml via:
>>    <persistence-unit name="corm-party">
>>      <jta-data-source>java:openejb/Resource/myDataSource</jta-data-
>> source>
>>      <non-jta-data-source>=java:openejb/Resource/myNonJtaDataSource</
>> non-jta-data-source>
>>    </persistence-unit>
>>
>> The second and more important.  Why do you want to split these Entity
>> beans up into so many persitence-units.  Is this a packaging concern
>> or is it really your intent to have several completely separate
>> caches, each with it's own connection to the database, and each
>> managing it's own transaction with no cooperation and visibility to
>> the other?  I suspect the answer is no as you have attempted to point
>> them all at the same database.  If you start sharing data between  
>> them
>> you could wind up with some serious data integrity issues.
>>
>> I can recommend a better approach once I better understand your
>> motivation.
>>
>> -David
>>
>>


Mime
View raw message