Hi Dimitar,

On Sun, Jun 24, 2012 at 12:17 PM, Dimitar Popov <dimitar.popov@uni-konstanz.de> wrote:

some hints, which may help reveal the problem:

 

On Sunday 24 June 2012 11:47:15 Willian Barcella wrote:

> I close DB each insert, this is my code:

> ...

> public void save(String key, DocumentWrapper value)

> {

> BaseXClient baseXClient = null;

> try

> {

> //Open or Create database

> baseXClient = this.takeConnection();

> baseXClient.execute(format(CHECK, value.getCollectionName()));

> InputStream is =

> XMLUtils.nodeToInputStream(value.getDocument());

 

is DocumentWrapper.getCollectionName() thread-safe?

It is not, but I am creating a new object everytime.

 

> baseXClient.replace(value.getId(), is);

> } catch (Exception e)

> {

 

you may want to log a possible exception here - otherwise, it will be silently ignored, since it occurs in a thread other than the main one.

I inserted a log in this point you mentioned, didnt catch nothing

 

> throw new RuntimeException(e);

> } finally

> {

> try

> {

> baseXClient.execute(CLOSE);

> if (baseXClient != null)

> this.giveBack(baseXClient);

> } catch (IOException e)

> {

> logger.error("Error closing db", e);

> }

> }

> }

> ...

>

> What you mean "single writer"?

 

I mean that, the basex server has internal lock mechanism, which blocks all sessions willing to execute an updating query, and effectively, it executes them sequentially, i.e. one after another. this means that basex does not support parallel execution of update queries.

Even BaseX does not support parallel updates, in server side it shouldn't lose documents or it should throw an exception to client side saying that document was not inserted.

 

regards,

dimitar

> On Sun, Jun 24, 2012 at 11:38 AM, Dimitar Popov <

>

> dimitar.popov@uni-konstanz.de> wrote:

> > check if you close the database after each insert operation. you should

> > also

> > know that currently, basex allows only a single writer, i.e. if you use

> > multiple threads just to insert of the documents faster, that won't

> > happen.

> >

> > regards,

> > dimitar

> >

> > On Sunday 24 June 2012 11:24:00 Willian Barcella wrote:

> > > There was an error in my code, I fixed it.

> > > Now I am not getting errors on client side, but BaseX is not persisting

> >

> > all

> >

> > > documents that I inserted.

> > > I created 20 BaseXClient's, 10 threads to take BasXClient from a

> > > LinkedBlockingQueue, each thread was

> > > responsible to insert 1000 documents, total of documents 10 x 1000 =

> > > 10K,

> > > however was inserted 9801.

> > >

> > > Regards

> > >

> > > On Sun, Jun 24, 2012 at 10:48 AM, Christian Grün

> > >

> > > <christian.gruen@gmail.com>wrote:

> > > > Hi Willian,

> > > >

> > > > thanks for your mail. I would assume that one single BaseXClient

> > > > object was used for several concurrent tasks. As BaseXClient objects

> > > > are very light-weight, and as the registration of new clients is

> > > > usually more than fast enough, the usual approach is to create a new

> > > > BaseXClient instance for a dedicated action.

> > > >

> > > > Hope this helps,

> > > > Christian

> > > > _______________________________

> > > >

> > > > > I builded a kind of connection pool using BaseXClient.java class, I

> > > > > simulated several users trying insert documents in BaseX,

> > > > > the result was a disaster.

> > > > > ERROR: data.BaseXDataAccess - Error closing db

> > > > > java.io.IOException: Stopped at line 1, column 19:

> > > > > Unknown command: 1340477810253095000. Try HELP.

> > > > >

> > > > > at data.BaseXClient.execute(BaseXClient.java:99)

> > > > > at data.BaseXClient.execute(BaseXClient.java:110)

> > > > > at data.BaseXDataAccess.save(BaseXDataAccess.java:169)

> > > > > at data.TestInsert$Insert.run(TestInsert.java:88)

> > > > > at java.lang.Thread.run(Thread.java:680)

> > > > >

> > > > > Exception in thread "Thread-1" java.lang.RuntimeException:

> > > > >

> > > > > java.io.IOException:

> > > > > at data.BaseXDataAccess.save(BaseXDataAccess.java:164)

> > > > >

> > > > > at data.TestInsert$Insert.run(TestInsert.java:88)ERROR:

> > > > > com.xftec.hyperion.data.BaseXDataAccess - Error closing db

> > > > >

> > > > > I started several threads each one takes a BaseXClient connection

> >

> > and as

> >

> > > > > soon as it finishs its job BaseXClient is put in a

> > > > > queue again to be took by other thread.

> > > > >

> > > > > _______________________________________________

> > > > > BaseX-Talk mailing list

> > > > > BaseX-Talk@mailman.uni-konstanz.de

> > > > > https://mailman.uni-konstanz.de/mailman/listinfo/basex-talk

> >

> > _______________________________________________

> > BaseX-Talk mailing list

> > BaseX-Talk@mailman.uni-konstanz.de

> > https://mailman.uni-konstanz.de/mailman/listinfo/basex-talk