Thank you, dslake, for a set of patches to improve OpenSim startup

and idle performance.
This commit is contained in:
Melanie
2009-09-02 03:33:31 +01:00
parent 2fc3f61a42
commit f32de6fe88
8 changed files with 63 additions and 21 deletions

View File

@@ -412,8 +412,8 @@ namespace OpenSim.Data.MySQL
public List<SceneObjectGroup> LoadObjects(UUID regionUUID)
{
UUID lastGroupID = UUID.Zero;
List<SceneObjectGroup> objects = new List<SceneObjectGroup>();
List<SceneObjectPart> prims = new List<SceneObjectPart>();
Dictionary<UUID, SceneObjectGroup> objects = new Dictionary<UUID, SceneObjectGroup>();
Dictionary<UUID, SceneObjectPart> prims = new Dictionary<UUID, SceneObjectPart>();
SceneObjectGroup grp = null;
lock (m_Connection)
@@ -441,14 +441,14 @@ namespace OpenSim.Data.MySQL
else
prim.Shape = BuildShape(reader);
prims.Add(prim);
prims[prim.UUID] = prim;
UUID groupID = new UUID(reader["SceneGroupID"].ToString());
if (groupID != lastGroupID) // New SOG
{
if (grp != null)
objects.Add(grp);
objects[grp.UUID] = grp;
lastGroupID = groupID;
@@ -487,16 +487,47 @@ namespace OpenSim.Data.MySQL
}
if (grp != null)
objects.Add(grp);
objects[grp.UUID] = grp;
cmd.Dispose();
}
foreach (SceneObjectPart part in prims)
LoadItems(part);
// Instead of attempting to LoadItems on every prim,
// most of which probably have no items... get a
// list from DB of all prims which have items and
// LoadItems only on those
List<SceneObjectPart> primsWithInventory = new List<SceneObjectPart>();
lock (m_Connection)
{
MySqlCommand itemCmd = m_Connection.CreateCommand();
itemCmd.CommandText = "select distinct primID from primitems";
IDataReader itemReader = ExecuteReader(itemCmd);
try
{
while (itemReader.Read())
{
if (!(itemReader["primID"] is DBNull))
{
UUID primID = new UUID(itemReader["primID"].ToString());
if (prims.ContainsKey(primID))
{
primsWithInventory.Add(prims[primID]);
}
}
}
}
finally
{
itemReader.Close();
}
itemCmd.Dispose();
}
foreach (SceneObjectPart prim in primsWithInventory)
{
LoadItems(prim);
}
m_log.DebugFormat("[REGION DB]: Loaded {0} objects using {1} prims", objects.Count, prims.Count);
return objects;
return new List<SceneObjectGroup>(objects.Values);
}
/// <summary>