 |
/*
* Berkeley DB XML .NET API
*
* Copyright (C) 2007 Jana Business Consulting Ltd. All rights reserved.
*
* For more information, see http://www.janabiz.com.
*
*/
using System;
using JanaBiz.DbXml;
using JanaBiz.Db;
//using Bridge;
using System.IO;
using System.Threading;
using System.Collections;
public class MutilThread
{
int outCount = 0;
private static Hashtable extMap = new Hashtable();
public static void Main()
{
MutilThread test = new MutilThread();
test.doReadAndWrite();
}
private string getDbxmlName()
{
return "DbEnvconcurrentTest.dbxml";
}
private string getDocName()
{
return "myDocument";
}
/// <summary>
/// Clrears all db files.
/// </summary>
/// <param name="home">The home.</param>
public static void ClrearAllDbFiles(string home)
{
extMap.Add(".DLL", true);
extMap.Add(".EXE", true);
extMap.Add(".PDB", true);
extMap.Add(".XML", true);
extMap.Add(".SH", true);
string[] files = Directory.GetFiles(home);
foreach(string file in files)
{
string ext = Path.GetExtension(file).ToUpper();
if(!extMap.Contains(ext))
{
File.Delete(file);
}
}
}
/**
public void doWrite()
{
string dirHome = Directory.GetCurrentDirectory();
ClrearAllDbFiles(dirHome);
for(int i=0; i<4; i++)
{
ThreadStart threadstart = new ThreadStart(putDoc);
Thread t1 = new Thread(threadstart);
t1.Name = "XmlDB-Thread" + (i + 1);
t1.Start();
Thread.Sleep(103);
}
}
**/
public void doReadAndWrite()
{
string dirHome = Directory.GetCurrentDirectory();
ClrearAllDbFiles(dirHome);
string dbxmlName = getDbxmlName();
string docName = getDocName();
CreatXmlContainer(dbxmlName);
putADoc(dbxmlName,docName);
ThreadStart thread1 = new ThreadStart(getDocuments);
Thread t1 = new Thread(thread1);
t1.Name = "Thread-getDoc-1";
ThreadStart thread2 = new ThreadStart(getDocuments_2);
Thread t2 = new Thread(thread2);
t2.Name = "Thread-getDoc-2";
ThreadStart thread3 = new ThreadStart(updateDocuments);
Thread t3 = new Thread(thread3);
t3.Name = "Thread-updateDoc-3";
ThreadStart thread4 = new ThreadStart(updateDocuments_2);
Thread t4 = new Thread(thread4);
t4.Name = "Thread-updateDoc-4";
t1.Start();
//t2.Start();
t3.Start();
t4.Start();
}
/// <summary>
/// put different document
/// </summary>
private void CreatXmlContainer(string dbXmlName){
DbEnvironment dbEnv = null;
XmlManager xmlManager1 = null;
XmlContainer con1 = null;
try{
dbEnv = CreateDbEnvironment();
//XmlManager.SetLogLevel(LogLevel.All, true);
//XmlManager.SetLogCategory(LogCategory.All, true);
xmlManager1 = new XmlManager(dbEnv);
XmlContainerConfig config3 = new XmlContainerConfig();
config3.AllowCreate = true;
con1 = xmlManager1.OpenContainer(dbXmlName,config3);
XmlUpdateContext up1 = xmlManager1.CreateUpdateContext();
for(int i=0; i<100; i++)
{
string docName = Thread.CurrentThread.Name + "doc" + i;
string docContent = "<a>index" + i + "</a>";
Console.WriteLine(" init put doc:"+ docName+ ":["+docContent + "]");
con1.PutDocument(docName,docContent, up1);
Thread.Sleep(13);
}
up1.Dispose();
con1.Dispose();
xmlManager1.Dispose();
}
catch(Exception ex)
{
System.Console.WriteLine(ex);
}
finally
{
if(con1 != null)
{
con1.Close();
}
if(xmlManager1 != null)
{
xmlManager1.Close();
}
}
}
/// <summary>
/// put a document
/// </summary>
private void putADoc(string dbXmlName,string docName)
{
DbEnvironment dbEnv = null;
XmlManager xmlManager1 = null;
XmlContainer con1 = null;
try
{
dbEnv = CreateDbEnvironment();
XmlManager.SetLogLevel(LogLevel.All, true);
XmlManager.SetLogCategory(LogCategory.All, true);
xmlManager1 = new XmlManager(dbEnv);
XmlContainerConfig config3 = new XmlContainerConfig();
config3.AllowCreate = true;
con1 = xmlManager1.OpenContainer(dbXmlName,config3);
XmlUpdateContext up1 = xmlManager1.CreateUpdateContext();
Console.WriteLine(docName);
con1.PutDocument(docName, "<a>sdfffffff</a>", up1);
up1.Dispose();
con1.Dispose();
xmlManager1.Dispose();
}
catch(Exception ex)
{
Console.WriteLine(ex);
}
finally
{
if(con1 != null)
{
con1.Close();
}
if(xmlManager1 != null)
{
xmlManager1.Close();
}
}
}
/// <summary>
/// get a document
/// </summary>
private void getADoc()
{
string dbXmlName = getDbxmlName();
string docName = getDocName();
DbEnvironment dbEnv = CreateDbEnvironment();
XmlManager.SetLogLevel(LogLevel.All, true);
XmlManager.SetLogCategory(LogCategory.All, true);
XmlManager xmlManager1 = new XmlManager(dbEnv);
XmlContainerConfig config3 = new XmlContainerConfig();
config3.AllowCreate = true;
XmlContainer con1 = xmlManager1.OpenContainer(dbXmlName,config3);
XmlUpdateContext up1 = xmlManager1.CreateUpdateContext();
XmlDocumentConfig dconfig = new XmlDocumentConfig();
XmlDocument doc = con1.GetDocument(docName, dconfig);
Console.WriteLine("****get doc ■■" + doc.StringContent);
up1.Dispose();
con1.Dispose();
xmlManager1.Dispose();
}
private DbEnvironment CreateDbEnvironment()
{
DbEnvironmentConfig dbConfig = new DbEnvironmentConfig();
dbConfig.AllowCreate = true;
//dbConfig.ErrorPrefix = "PREFIX ";
//dbConfig.ErrorWriter = System.Console.Out;
// you can not specify other parameters
dbConfig.InitializeCBD = true;
dbConfig.InitializeCache = true;
dbConfig.CdbLockAllDatabases = true;
DbEnvironment dbEnv = new DbEnvironment(Directory.GetCurrentDirectory(),dbConfig);
return dbEnv;
}
/// <summary>
/// put document to max times
/// </summary>
private void updateDocuments()
{
string dbXmlName = getDbxmlName();
string docName = getDocName();
DbEnvironment dbEnv = CreateDbEnvironment();
//XmlManager.SetLogLevel(LogLevel.All, true);
//XmlManager.SetLogCategory(LogCategory.All, true);
XmlManager xmlManager1 = new XmlManager(dbEnv);
XmlContainerConfig config3 = new XmlContainerConfig();
config3.AllowCreate = true;
XmlContainer con1 = xmlManager1.OpenContainer(dbXmlName,config3);
XmlUpdateContext up1 = xmlManager1.CreateUpdateContext();
XmlDocumentConfig dconfig = new XmlDocumentConfig();
for(int i=0; i<50; i++)
{
XmlDocument doc = con1.GetDocument(docName, dconfig);
String origionStr = doc.StringContent ;
doc.StringContent = "<a>update[1] i=" + (i+1) + "</a>";
con1.UpdateDocument(doc, up1);
String line = (outCount++) + "口 updateDocuments()\t" + (i + 1) + "■" + Thread.CurrentThread.Name + "\t■\t";
line = line + " OrigionStr:["+ origionStr + "] DOC content:" + doc.StringContent + "。終わり。";
line = line + "\n";
Console.WriteLine(line);
doc.Dispose();
Thread.Sleep(5);
}
up1.Dispose();
con1.Dispose();
xmlManager1.Dispose();
}
/// <summary>
/// get document to max times
/// </summary>
private void getDocuments()
{
string dbXmlName = getDbxmlName();
string docName = getDocName();
DbEnvironment dbEnv = CreateDbEnvironment();
//XmlManager.SetLogLevel(LogLevel.All, true);
//XmlManager.SetLogCategory(LogCategory.All, true);
XmlManager xmlManager1 = new XmlManager(dbEnv);
XmlContainerConfig config3 = new XmlContainerConfig();
config3.AllowCreate = true;
XmlContainer con1 = xmlManager1.OpenContainer(dbXmlName,config3);
XmlUpdateContext up1 = xmlManager1.CreateUpdateContext();
XmlDocumentConfig dconfig = new XmlDocumentConfig();
for(int i=0; i<100; i++)
{
XmlDocument doc = con1.GetDocument(docName, dconfig);
String line = (outCount++) + ">> getDocuments()\t" + (i + 1) + "■" + Thread.CurrentThread.Name + "\t■\t";
line = line + " DOC content:" + doc.StringContent + "。終わり。";
line = line + "\n";
Console.WriteLine(line);
Thread.Sleep(1);
}
up1.Dispose();
con1.Dispose();
xmlManager1.Dispose();
}
/// <summary>
/// put document to max times
/// </summary>
private void updateDocuments_2()
{
string dbXmlName = getDbxmlName();
string docName = getDocName();
DbEnvironment dbEnv = CreateDbEnvironment();
//XmlManager.SetLogLevel(LogLevel.All, true);
//XmlManager.SetLogCategory(LogCategory.All, true);
XmlManager xmlManager1 = new XmlManager(dbEnv);
XmlContainerConfig config3 = new XmlContainerConfig();
config3.AllowCreate = true;
XmlContainer con1 = xmlManager1.OpenContainer(dbXmlName,config3);
XmlUpdateContext up1 = xmlManager1.CreateUpdateContext();
XmlDocumentConfig dconfig = new XmlDocumentConfig();
for(int i=0; i<50; i++)
{
XmlDocument doc = con1.GetDocument(docName, dconfig);
String origionStr = doc.StringContent ;
doc.StringContent = "<a>update[2] i=" + (i+1) + "</a>";
con1.UpdateDocument(doc, up1);
String line = (outCount++) + "口 updateDocuments()\t" + (i + 1) + "■" + Thread.CurrentThread.Name + "\t■\t";
line = line + " OrigionStr:["+ origionStr + "] DOC content:" + doc.StringContent + "。終わり。";
line = line + "\n";
Console.WriteLine(line);
doc.Dispose();
Thread.Sleep(4);
}
up1.Dispose();
con1.Dispose();
xmlManager1.Dispose();
}
/// <summary>
/// get document to max times
/// </summary>
private void getDocuments_2()
{
string dbXmlName = getDbxmlName();
string docName = getDocName();
DbEnvironment dbEnv = CreateDbEnvironment();
//XmlManager.SetLogLevel(LogLevel.All, true);
//XmlManager.SetLogCategory(LogCategory.All, true);
XmlManager xmlManager1 = new XmlManager(dbEnv);
XmlContainerConfig config3 = new XmlContainerConfig();
config3.AllowCreate = true;
XmlContainer con1 = xmlManager1.OpenContainer(dbXmlName,config3);
XmlUpdateContext up1 = xmlManager1.CreateUpdateContext();
XmlDocumentConfig dconfig = new XmlDocumentConfig();
for(int i=0; i<100; i++)
{
XmlDocument doc = con1.GetDocument(docName, dconfig);
String line = (outCount++) + ">> getDocuments()\t" + (i + 1) + "■" + Thread.CurrentThread.Name + "\t■\t";
line = line + "\n" + " DOC content:" + doc.StringContent + "。終わり。";
line = line + "\n";
Console.WriteLine(line );
Thread.Sleep(2);
}
up1.Dispose();
con1.Dispose();
xmlManager1.Dispose();
}
}
 |
|
 |
|