You are viewing a plain text version of this content. The canonical link for it is here.
Posted to ojb-dev@db.apache.org by ar...@apache.org on 2004/09/28 16:13:50 UTC
cvs commit: db-ojb/src/test/org/apache/ojb repository_junit_reference.xml
arminw 2004/09/28 07:13:50
Modified: src/schema Tag: OJB_1_0_RELEASE ojbtest-schema.xml
src/test/org/apache/ojb/broker Tag: OJB_1_0_RELEASE
MultithreadedReadTest.java
src/test/org/apache/ojb Tag: OJB_1_0_RELEASE
repository_junit_reference.xml
Log:
modify test to show problem with object materialization
in multthreaded environments under heavy load
Revision Changes Path
No revision
No revision
1.80.2.2 +15 -1 db-ojb/src/schema/ojbtest-schema.xml
Index: ojbtest-schema.xml
===================================================================
RCS file: /home/cvs/db-ojb/src/schema/ojbtest-schema.xml,v
retrieving revision 1.80.2.1
retrieving revision 1.80.2.2
diff -u -r1.80.2.1 -r1.80.2.2
--- ojbtest-schema.xml 27 Jul 2004 00:31:50 -0000 1.80.2.1
+++ ojbtest-schema.xml 28 Sep 2004 14:13:49 -0000 1.80.2.2
@@ -857,6 +857,20 @@
<column name="FK_REF" type="INTEGER"/>
</table>
+ <table name="READTEST_INVOICE">
+ <column name="OJB_ID" required="true" primaryKey="true" type="INTEGER"/>
+ <column name="NAME" type="VARCHAR" size="150"/>
+ <column name="INVOICE_NUMBER" type="VARCHAR" size="150"/>
+ <column name="FK_REF" type="INTEGER"/>
+ </table>
+
+ <table name="READTEST_ARTICLE">
+ <column name="OJB_ID" required="true" primaryKey="true" type="INTEGER"/>
+ <column name="NAME" type="VARCHAR" size="150"/>
+ <column name="DESCRIPTION" type="VARCHAR" size="150"/>
+ <column name="FK_REF" type="INTEGER"/>
+ </table>
+
<table name="READTEST_ADDRESS">
<column name="OJB_ID" required="true" primaryKey="true" type="INTEGER"/>
<column name="NAME" type="VARCHAR" size="150"/>
No revision
No revision
1.3.2.1 +265 -51 db-ojb/src/test/org/apache/ojb/broker/MultithreadedReadTest.java
Index: MultithreadedReadTest.java
===================================================================
RCS file: /home/cvs/db-ojb/src/test/org/apache/ojb/broker/MultithreadedReadTest.java,v
retrieving revision 1.3
retrieving revision 1.3.2.1
diff -u -r1.3 -r1.3.2.1
--- MultithreadedReadTest.java 5 Apr 2004 17:11:48 -0000 1.3
+++ MultithreadedReadTest.java 28 Sep 2004 14:13:49 -0000 1.3.2.1
@@ -6,6 +6,8 @@
import java.util.Iterator;
import java.util.List;
+import org.apache.ojb.broker.metadata.ClassDescriptor;
+import org.apache.ojb.broker.metadata.ObjectReferenceDescriptor;
import org.apache.ojb.broker.query.Criteria;
import org.apache.ojb.broker.query.QueryByCriteria;
import org.apache.ojb.junit.JUnitExtensions;
@@ -19,7 +21,11 @@
*/
public class MultithreadedReadTest extends JUnitExtensions.MultiThreadedTestCase
{
- int loops = 2;
+ static final int NONE = ObjectReferenceDescriptor.CASCADE_NONE;
+ static final int LINK = ObjectReferenceDescriptor.CASCADE_LINK;
+ static final int OBJECT = ObjectReferenceDescriptor.CASCADE_OBJECT;
+
+ int loops = 1;
int concurrentThreads = 19;
int numberOfObjects = 30;
@@ -41,19 +47,39 @@
protected void tearDown() throws Exception
{
+ PersistenceBroker broker = PersistenceBrokerFactory.defaultPersistenceBroker();
+ try
+ {
+ changeReferenceSetting(broker, AccountImpl.class, "buyer", true, NONE, NONE, false);
+ changeReferenceSetting(broker, BuyerImpl.class, "address", true, NONE, NONE, false);
+ changeReferenceSetting(broker, BuyerImpl.class, "invoices", true, NONE, NONE, false);
+ changeReferenceSetting(broker, BuyerImpl.class, "articles", true, NONE, NONE, false);
+ }
+ finally
+ {
+ if(broker != null)
+ {
+ broker.close();
+ }
+ }
super.tearDown();
}
public void testClosedPB() throws Throwable
{
String name = "testClosedPB_"+System.currentTimeMillis();
-
- Integer[] ids = prepareTestRead(name, 5);
Account account = null;
PersistenceBroker broker = null;
try
{
broker = PersistenceBrokerFactory.defaultPersistenceBroker();
+ changeReferenceSetting(broker, AccountImpl.class, "buyer", true, OBJECT, OBJECT, false);
+ changeReferenceSetting(broker, BuyerImpl.class, "address", true, OBJECT, OBJECT, false);
+ changeReferenceSetting(broker, BuyerImpl.class, "invoices", true, OBJECT, OBJECT, false);
+ changeReferenceSetting(broker, BuyerImpl.class, "articles", true, OBJECT, OBJECT, false);
+ Integer[] ids = prepareTestRead(broker, name, 5);
+ broker.clearCache();
+
Criteria crit = new Criteria();
crit.addIn("id", Arrays.asList(ids));
QueryByCriteria query = new QueryByCriteria(Account.class, crit);
@@ -89,13 +115,18 @@
for (int k = 0; k < loops; k++)
{
String searchCriteria = "testObjectMaterializationByDifferentThread_" + System.currentTimeMillis();
- prepareTestRead(searchCriteria, concurrentThreads);
-
- Collection accounts;
PersistenceBroker broker = null;
+ Collection accounts;
try
{
broker = PersistenceBrokerFactory.defaultPersistenceBroker();
+ changeReferenceSetting(broker, AccountImpl.class, "buyer", true, OBJECT, OBJECT, false);
+ changeReferenceSetting(broker, BuyerImpl.class, "address", true, OBJECT, OBJECT, true);
+ changeReferenceSetting(broker, BuyerImpl.class, "invoices", true, OBJECT, OBJECT, true);
+ changeReferenceSetting(broker, BuyerImpl.class, "articles", true, OBJECT, OBJECT, false);
+ prepareTestRead(broker, searchCriteria, concurrentThreads);
+ broker.clearCache();
+
Criteria crit = new Criteria();
crit.addEqualTo("name", searchCriteria);
QueryByCriteria query = new QueryByCriteria(Account.class, crit);
@@ -123,15 +154,32 @@
public void testMultithreadedRead() throws Exception
{
String searchCriteria = "testMultithreadedRead_" + System.currentTimeMillis();
- prepareTestRead(searchCriteria, numberOfObjects);
+ PersistenceBroker broker = null;
+ try
+ {
+ broker = PersistenceBrokerFactory.defaultPersistenceBroker();
+ changeReferenceSetting(broker, AccountImpl.class, "buyer", true, OBJECT, OBJECT, false);
+ changeReferenceSetting(broker, BuyerImpl.class, "address", true, OBJECT, OBJECT, false);
+ changeReferenceSetting(broker, BuyerImpl.class, "invoices", true, OBJECT, OBJECT, false);
+ changeReferenceSetting(broker, BuyerImpl.class, "articles", true, OBJECT, OBJECT, false);
+ prepareTestRead(broker, searchCriteria, numberOfObjects);
+ broker.clearCache();
+ }
+ finally
+ {
+ if(broker != null) broker.close();
+ }
+
+ System.out.println();
System.out.println("Multithreaded read of objects - start");
System.out.println("" + concurrentThreads + " concurrent threads read "
+ numberOfObjects + " objects per thread, loop " + loops + " times");
for (int k = 0; k < loops; k++)
{
- PersistenceBroker broker = PersistenceBrokerFactory.defaultPersistenceBroker();
+ broker = PersistenceBrokerFactory.defaultPersistenceBroker();
broker.clearCache();
broker.close();
+
TestCaseRunnable tct [] = new TestCaseRunnable[concurrentThreads];
for (int i = 0; i < concurrentThreads; i++)
{
@@ -140,7 +188,7 @@
// run test classes
runTestCaseRunnables(tct);
}
- System.out.println();
+
System.out.println("Multithreaded read of objects - end");
}
@@ -150,15 +198,33 @@
public void testMultithreadedLazyRead() throws Exception
{
String name = "testMultithreadedLazyRead" + System.currentTimeMillis();
- List identityList = prepareTestLazyRead(name, concurrentThreads);
+ PersistenceBroker broker = null;
+ List identityList = null;
+ try
+ {
+ broker = PersistenceBrokerFactory.defaultPersistenceBroker();
+ changeReferenceSetting(broker, AccountImpl.class, "buyer", true, OBJECT, OBJECT, false);
+ changeReferenceSetting(broker, BuyerImpl.class, "address", true, OBJECT, OBJECT, true);
+ changeReferenceSetting(broker, BuyerImpl.class, "invoices", true, OBJECT, OBJECT, true);
+ changeReferenceSetting(broker, BuyerImpl.class, "articles", true, OBJECT, OBJECT, true);
+ identityList = prepareTestLazyRead(broker, name, concurrentThreads);
+ broker.clearCache();
+ }
+ finally
+ {
+ if(broker != null) broker.close();
+ }
+
+ System.out.println();
System.out.println("Multithreaded lazy read of objects - start");
System.out.println("" + concurrentThreads + " concurrent threads read different object with lazy" +
" materialization reference, loop " + loops + " times");
for (int k = 0; k < loops; k++)
{
- PersistenceBroker broker = PersistenceBrokerFactory.defaultPersistenceBroker();
+ broker = PersistenceBrokerFactory.defaultPersistenceBroker();
broker.clearCache();
broker.close();
+
TestCaseRunnable tct [] = new TestCaseRunnable[concurrentThreads];
for (int i = 0; i < concurrentThreads; i++)
{
@@ -167,63 +233,85 @@
// run test classes
runTestCaseRunnables(tct);
}
- System.out.println();
System.out.println("Multithreaded lazy read of objects - end");
}
- private Integer[] prepareTestRead(String name, int numbers) throws Exception
+ private Integer[] prepareTestRead(PersistenceBroker broker, String name, int numbers) throws Exception
{
Integer[] ids = new Integer[numbers];
- PersistenceBroker broker = PersistenceBrokerFactory.defaultPersistenceBroker();
- try
+ for (int i = 0; i < numbers; i++)
{
- broker.beginTransaction();
- for (int i = 0; i < numbers; i++)
- {
- AddressType type = new AddressTypeImpl(name);
- Address address = new AddressImpl(name, type);
- Buyer buyer = new BuyerImpl(name, address);
- Account account = new AccountImpl(name, buyer);
- broker.store(account);
- ids[i] = account.getId();
- }
- broker.commitTransaction();
- broker.clearCache();
+ AddressType type = new AddressTypeImpl(name);
+ Address address = new AddressImpl(name, type);
+ Buyer buyer = new BuyerImpl(name, address);
+ buyer.setArticles(buildArticles(name, numbers));
+ buyer.setInvoices(buildInvoices(name, numbers));
+ Account account = new AccountImpl(name, buyer);
+ broker.store(account);
+ ids[i] = account.getId();
}
- finally
+ return ids;
+ }
+
+ private List prepareTestLazyRead(PersistenceBroker broker, String searchCriteria, int numbers) throws Exception
+ {
+ List result = new ArrayList();
+ for (int i = 0; i < numbers; i++)
{
- if (broker != null) broker.close();
+ AddressType type = new AddressTypeImpl(searchCriteria);
+ Address address = new AddressImpl(searchCriteria, type);
+ Buyer buyer = new BuyerImpl(searchCriteria, address);
+ buyer.setArticles(buildArticles(searchCriteria, numbers));
+ buyer.setInvoices(buildInvoices(searchCriteria, numbers));
+ Account account = new AccountImpl(searchCriteria, buyer);
+ broker.store(account);
+ Identity oid = broker.serviceIdentity().buildIdentity(account);
+ result.add(oid);
}
- return ids;
+ return result;
}
- private List prepareTestLazyRead(String searchCriteria, int numbers) throws Exception
+ private List buildInvoices(String name, int numbers)
{
List result = new ArrayList();
- PersistenceBroker broker = PersistenceBrokerFactory.defaultPersistenceBroker();
- try
+ for(int i = 0; i < numbers; i++)
{
- broker.beginTransaction();
- for (int i = 0; i < numbers; i++)
- {
- AddressType type = new AddressTypeImpl(searchCriteria);
- Address address = new AddressImpl(searchCriteria, type);
- Buyer buyer = new BuyerImpl(searchCriteria, address);
- Account account = new AccountImpl(searchCriteria, buyer);
- broker.store(account);
- Identity oid = new Identity(account, broker);
- result.add(oid);
- }
- broker.commitTransaction();
- broker.clearCache();
+ String invoiceNumber = "I_" + (long)(Math.random() * Long.MAX_VALUE);
+ Invoice invoice = new InvoiceImpl(name, invoiceNumber);
+ result.add(invoice);
}
- finally
+ return result;
+ }
+
+ private List buildArticles(String name, int numbers)
+ {
+ List result = new ArrayList();
+ for(int i = 0; i < numbers; i++)
{
- if (broker != null) broker.close();
+ Article a = new ArticleImpl(name, "a article description");
+ result.add(a);
}
return result;
}
+ void changeReferenceSetting(PersistenceBroker broker, Class clazz, String fieldName, boolean autoRetrieve, int autoUpdate, int autoDelete, boolean proxy)
+ {
+ ClassDescriptor cld = broker.getClassDescriptor(clazz);
+ ObjectReferenceDescriptor descriptor = cld.getCollectionDescriptorByName(fieldName);
+ if(descriptor == null)
+ {
+ descriptor = cld.getObjectReferenceDescriptorByName(fieldName);
+ }
+ if(descriptor == null)
+ {
+ throw new RuntimeException("Field name " + fieldName + " does not represent a reference in class '" + clazz.getName() + "'");
+ }
+ descriptor.setLazy(proxy);
+ descriptor.setCascadeRetrieve(autoRetrieve);
+ descriptor.setCascadingStore(autoUpdate);
+ descriptor.setCascadingDelete(autoDelete);
+ }
+
//***********************************************
// test handle of multithreaded test
@@ -263,6 +351,8 @@
assertNotNull("All buyers have a reference to an Address", account.getBuyer().getAddress());
assertNotNull("All addresses have a reference to an AdressType", account.getBuyer().getAddress().getType());
assertNotNull("All AddressType have a name", account.getBuyer().getAddress().getType().getName());
+ assertNotNull("All buyers have populated 1:n reference to Invoice", account.getBuyer().getInvoices());
+ assertNotNull("All buyers have populated 1:n reference to Article", account.getBuyer().getArticles());
// System.out.println(""+Thread.currentThread().toString()+": passed");
}
}
@@ -291,6 +381,8 @@
assertNotNull("All buyers have a reference to an Address", account.getBuyer().getAddress());
assertNotNull("All addresses have a reference to an AdressType", account.getBuyer().getAddress().getType());
assertNotNull("All AddressType have a name", account.getBuyer().getAddress().getType().getName());
+ assertNotNull("All buyers have populated 1:n reference to Invoice", account.getBuyer().getInvoices());
+ assertNotNull("All buyers have populated 1:n reference to Article", account.getBuyer().getArticles());
// System.out.println(""+Thread.currentThread().toString()+": passed");
}
}
@@ -335,6 +427,8 @@
assertNotNull("All buyers have a reference to an Address", account.getBuyer().getAddress());
assertNotNull("All addresses have a reference to an AdressType", account.getBuyer().getAddress().getType());
assertNotNull("All AddressType have a name", account.getBuyer().getAddress().getType().getName());
+ assertNotNull("All buyers have populated 1:n reference to Invoice", account.getBuyer().getInvoices());
+ assertNotNull("All buyers have populated 1:n reference to Article", account.getBuyer().getArticles());
}
}
@@ -359,6 +453,8 @@
assertEquals(name, account.getBuyer().getAddress().getName());
assertNotNull("All addresses have a reference to an AdressType", account.getBuyer().getAddress().getType());
assertNotNull("All AddressType have a name", account.getBuyer().getAddress().getType().getName());
+ assertNotNull("All buyers have populated 1:n reference to Invoice", account.getBuyer().getInvoices());
+ assertNotNull("All buyers have populated 1:n reference to Article", account.getBuyer().getArticles());
}
}
@@ -407,13 +503,18 @@
public interface Buyer extends Base
{
Address getAddress();
-
void setAddress(Address address);
+ public List getInvoices();
+ public void setInvoices(List invoices);
+ public List getArticles();
+ public void setArticles(List articles);
}
public static class BuyerImpl extends BaseImpl implements Buyer
{
- Address address;
+ private Address address;
+ private List invoices;
+ private List articles;
public BuyerImpl(String name, Address address)
{
@@ -421,6 +522,14 @@
this.address = address;
}
+ public BuyerImpl(String name, Address address, List invoices, List articles)
+ {
+ super(name);
+ this.address = address;
+ this.invoices = invoices;
+ this.articles = articles;
+ }
+
public BuyerImpl(Address address)
{
this.address = address;
@@ -431,6 +540,26 @@
}
+ public List getInvoices()
+ {
+ return invoices;
+ }
+
+ public void setInvoices(List invoices)
+ {
+ this.invoices = invoices;
+ }
+
+ public List getArticles()
+ {
+ return articles;
+ }
+
+ public void setArticles(List articles)
+ {
+ this.articles = articles;
+ }
+
public Address getAddress()
{
return address;
@@ -539,6 +668,91 @@
public void setName(String name)
{
this.name = name;
+ }
+ }
+
+ public static interface Invoice extends Base
+ {
+ public String getInvoiceNumber();
+ public void setInvoiceNumber(String invoiceNumber);
+ }
+
+ public static class InvoiceImpl extends BaseImpl implements Invoice
+ {
+ private String invoiceNumber;
+ private Integer buyerId;
+
+ public InvoiceImpl()
+ {
+ }
+
+ public InvoiceImpl(String name, String invoiceNumber)
+ {
+ super(name);
+ this.invoiceNumber = invoiceNumber;
+ }
+
+
+ public Integer getBuyerId()
+ {
+ return buyerId;
+ }
+
+ public void setBuyerId(Integer buyerId)
+ {
+ this.buyerId = buyerId;
+ }
+
+ public String getInvoiceNumber()
+ {
+ return invoiceNumber;
+ }
+
+ public void setInvoiceNumber(String invoiceNumber)
+ {
+ this.invoiceNumber = invoiceNumber;
+ }
+ }
+
+ public static interface Article extends Base
+ {
+ public String getDescription();
+ public void setDescription(String description);
+ }
+
+ public static class ArticleImpl extends BaseImpl implements Article
+ {
+ private String description;
+ private Integer buyerId;
+
+ public ArticleImpl()
+ {
+ }
+
+ public ArticleImpl(String name, String description)
+ {
+ super(name);
+ this.description = description;
+ }
+
+ public Integer getBuyerId()
+ {
+ return buyerId;
+ }
+
+ public void setBuyerId(Integer buyerId)
+ {
+ this.buyerId = buyerId;
+ }
+
+ public String getDescription()
+ {
+ return description;
+ }
+
+ public void setDescription(String description)
+ {
+ this.description = description;
}
}
}
No revision
No revision
1.17.2.2 +95 -3 db-ojb/src/test/org/apache/ojb/repository_junit_reference.xml
Index: repository_junit_reference.xml
===================================================================
RCS file: /home/cvs/db-ojb/src/test/org/apache/ojb/repository_junit_reference.xml,v
retrieving revision 1.17.2.1
retrieving revision 1.17.2.2
diff -u -r1.17.2.1 -r1.17.2.2
--- repository_junit_reference.xml 11 Sep 2004 17:42:08 -0000 1.17.2.1
+++ repository_junit_reference.xml 28 Sep 2004 14:13:50 -0000 1.17.2.2
@@ -1175,6 +1175,14 @@
<extent-class class-ref="org.apache.ojb.broker.MultithreadedReadTest$AddressTypeImpl"/>
</class-descriptor>
+ <class-descriptor class="org.apache.ojb.broker.MultithreadedReadTest$Invoice">
+ <extent-class class-ref="org.apache.ojb.broker.MultithreadedReadTest$InvoiceImpl"/>
+ </class-descriptor>
+
+ <class-descriptor class="org.apache.ojb.broker.MultithreadedReadTest$Article">
+ <extent-class class-ref="org.apache.ojb.broker.MultithreadedReadTest$ArticleImpl"/>
+ </class-descriptor>
+
<class-descriptor
class="org.apache.ojb.broker.MultithreadedReadTest$AccountImpl"
table="READTEST_ACCOUNT"
@@ -1215,6 +1223,68 @@
</class-descriptor>
<class-descriptor
+ class="org.apache.ojb.broker.MultithreadedReadTest$ArticleImpl"
+ table="READTEST_ARTICLE"
+ >
+ <field-descriptor
+ name="id"
+ column="OJB_ID"
+ jdbc-type="INTEGER"
+ primarykey="true"
+ autoincrement="true"
+ />
+
+ <field-descriptor
+ name="buyerId"
+ column="FK_REF"
+ jdbc-type="INTEGER"
+ />
+
+ <field-descriptor
+ name="name"
+ column="NAME"
+ jdbc-type="VARCHAR"
+ />
+
+ <field-descriptor
+ name="description"
+ column="DESCRIPTION"
+ jdbc-type="VARCHAR"
+ />
+ </class-descriptor>
+
+ <class-descriptor
+ class="org.apache.ojb.broker.MultithreadedReadTest$InvoiceImpl"
+ table="READTEST_INVOICE"
+ >
+ <field-descriptor
+ name="id"
+ column="OJB_ID"
+ jdbc-type="INTEGER"
+ primarykey="true"
+ autoincrement="true"
+ />
+
+ <field-descriptor
+ name="buyerId"
+ column="FK_REF"
+ jdbc-type="INTEGER"
+ />
+
+ <field-descriptor
+ name="name"
+ column="NAME"
+ jdbc-type="VARCHAR"
+ />
+
+ <field-descriptor
+ name="invoiceNumber"
+ column="INVOICE_NUMBER"
+ jdbc-type="VARCHAR"
+ />
+ </class-descriptor>
+
+ <class-descriptor
class="org.apache.ojb.broker.MultithreadedReadTest$BuyerImpl"
table="READTEST_BUYER"
proxy="dynamic"
@@ -1244,12 +1314,34 @@
name="address"
class-ref="org.apache.ojb.broker.MultithreadedReadTest$Address"
auto-retrieve="true"
- auto-update="true"
- auto-delete="false"
+ auto-update="none"
+ auto-delete="none"
proxy="false"
>
<foreignkey field-ref="fk"/>
</reference-descriptor>
+
+ <collection-descriptor
+ name="articles"
+ element-class-ref="org.apache.ojb.broker.MultithreadedReadTest$Article"
+ proxy="false"
+ auto-retrieve="true"
+ auto-update="none"
+ auto-delete="none"
+ >
+ <inverse-foreignkey field-ref="buyerId"/>
+ </collection-descriptor>
+
+ <collection-descriptor
+ name="invoices"
+ element-class-ref="org.apache.ojb.broker.MultithreadedReadTest$Invoice"
+ proxy="false"
+ auto-retrieve="true"
+ auto-update="none"
+ auto-delete="none"
+ >
+ <inverse-foreignkey field-ref="buyerId"/>
+ </collection-descriptor>
</class-descriptor>
<class-descriptor
---------------------------------------------------------------------
To unsubscribe, e-mail: ojb-dev-unsubscribe@db.apache.org
For additional commands, e-mail: ojb-dev-help@db.apache.org