In a test app I have created, I am able to insert only 2 rows per
request (for 1 entity with 10 properties only) into the datastore by
using low-level api without getting any warnings for cpu_ms /
api_cpu_ms usage.
However if I try to insert 3 rows or more (again only 1 entity being
inserted), the cpu gets used for more than 1s thereby generating a
warning or error from GAE.
Stats from GAE log:
For inserting 2 records -> /insert.do 200 77ms 655cpu_ms 643api_cpu_ms
(everything ok)
For inserting 3 records -> /insert.do 200 134ms 979cpu_ms
964api_cpu_ms (yellow warning)
For inserting 10 records -> /insert.do 200 178ms 3249cpu_ms
3216api_cpu_ms (red warning)
How to optimize the ‘cpu_ms and api_cpu_ms’ usage? Can GAE perform
only as many operations as 2 inserts into datastore if we want to keep
within the warning levels?
Can you please provide some feedback as to whether I am doing anything
wrong in code or have not used a good practice to achieve better
performance. Thanks in advance.
Code in servlet (parsing and split operations have been benchmarked
and they are not causing any adverse impact on performance):
Pattern p1 = Pattern.compile(","); // created as servlet instance
variable
public void doPost(HttpServletRequest req, HttpServletResponse res)
throws ServletException, IOException
{
try {
DatastoreService datastore =
DatastoreServiceFactory.getDatastoreService();
List<Entity> entity = new ArrayList<Entity>();
for (int i = 0; i < n; i++) {
String[] record =
p1.split("1,tester,1.0,1.0,1.0,1.0,1.0,1.0");
data1 = Long.parseLong(record[0]);
data2 = record[1];
data3 = Double.parseDouble(record[2]);
data4 = Double.parseDouble(record[3]);
data5 = Double.parseDouble(record[4]);
data6 = Double.parseDouble(record[5]);
data7 = Double.parseDouble(record[6]);
data8 = Float.parseFloat(record[7]);
Entity e = new
Entity(DetailsBean.class.getSimpleName());
e.setProperty("column1", i);
e.setProperty("column2", data2);
e.setProperty("column3", i + data3);
e.setProperty("column4", i + data4);
e.setProperty("column5", i + data5);
e.setProperty("column6", i + data6);
e.setProperty("column7", i + data7);
e.setProperty("column8", i + data8);
e.setProperty("crDate", new Date());
e.setProperty("modDate", new Date());
entity.add(e);
}
datastore.put(entity);
} catch (Exception e) {
e.printStackTrace();
} finally {
persistenceManager.close();
}
}
Entity bean code:
package com.pojo;
import java.io.Serializable;
import java.util.Date;
import java.util.List;
import javax.jdo.annotations.IdGeneratorStrategy;
import javax.jdo.annotations.IdentityType;
import javax.jdo.annotations.NotPersistent;
import javax.jdo.annotations.PersistenceCapable;
import javax.jdo.annotations.Persistent;
import javax.jdo.annotations.PrimaryKey;
@PersistenceCapable(identityType = IdentityType.APPLICATION)
public class DetailsBean implements Serializable {
private static final long serialVersionUID = 1L;
@PrimaryKey
@Persistent(valueStrategy = IdGeneratorStrategy.IDENTITY)
private Long slno;
@Persistent
private long column1;
@Persistent
private String column2;
@Persistent
private double column3;
@Persistent
private double column4;
@Persistent
private double column5;
@Persistent
private float column6;
@Persistent
private double column7;
@Persistent
private double column8;
@Persistent
private Date crDate;
@Persistent
private Date modDate;
@NotPersistent
private String message;
@NotPersistent
private int n;
@NotPersistent
private long offset;
@NotPersistent
private long range;
@NotPersistent
private List data;
public DetailsBean() {
}
public DetailsBean(long v1, String v2, double v3, double v4, double
v5,
float v6,
double v7, double v8) {
this.column1 = v1;
this.column2 = v2;
this.column3 = v3;
this.column4 = v4;
this.column5 = v5;
this.column6 = v6;
this.column7 = v7;
this.column8 = v8;
Date now = new Date();
this.crDate = now;
this.modDate = now;
}
public Long getSlno() {
return slno;
}
public void setSlno(Long slno) {
this.slno = slno;
}
public long getColumn1() {
return column1;
}
public void setColumn1(long column1) {
this.column1 = column1;
}
public String getColumn2() {
return column2;
}
public void setColumn2(String column2) {
this.column2 = column2;
}
public double getColumn3() {
return column3;
}
public void setColumn3(double column3) {
this.column3 = column3;
}
public double getColumn4() {
return column4;
}
public void setColumn4(double column4) {
this.column4 = column4;
}
public double getColumn5() {
return column5;
}
public void setColumn5(double column5) {
this.column5 = column5;
}
public float getColumn6() {
return column6;
}
public void setColumn6(float column6) {
this.column6 = column6;
}
public double getColumn7() {
return column7;
}
public void setColumn7(double column7) {
this.column7 = column7;
}
public double getColumn8() {
return column8;
}
public void setColumn8(double column8) {
this.column8 = column8;
}
public Date getCrDate() {
return crDate;
}
public void setCrDate(Date crDate) {
this.crDate = crDate;
}
public Date getModDate() {
return modDate;
}
public void setModDate(Date modDate) {
this.modDate = modDate;
}
public String getMessage() {
return message;
}
public void setMessage(String message) {
this.message = message;
}
public int getN() {
return n;
}
public void setN(int n) {
this.n = n;
}
public long getOffset() {
return offset;
}
public void setOffset(long offset) {
this.offset = offset;
}
public long getRange() {
return range;
}
public void setRange(long range) {
this.range = range;
}
public List getData() {
return data;
}
public void setData(List data) {
this.data = data;
}
}
--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google Groups
"Google App Engine for Java" group.
To post to this group, send email to [email protected]
To unsubscribe from this group, send email to
[email protected]
For more options, visit this group at
http://groups.google.com/group/google-appengine-java?hl=en
-~----------~----~----~----~------~----~------~--~---