You are viewing a plain text version of this content. The canonical link for it is here.
Posted to users@jena.apache.org by "P.Kremen" <P....@open.ac.uk> on 2011/05/12 16:27:23 UTC

SDB exception Table 'tie.NNodeQuads' doesn't exist

Dear all,

In a web app we are using  SDB 1.3.4 with Hash layout backed by MySQL server ver. 5.1.49. For historical reasons, we are currently using only one DB connection (provided by commons-dbcp 1.4 BasicDataSource) that is wrapped to the Store object which is in turn shared and synchronized.  Thus I believe, that the following code snippet initializes and uses SDB correctly (although I am aware that this setup is definitely not optimal - if there is time in future we would like to make a more sensible refactoring with a connection pool, etc.)  - am I right ?

  private static final StoreDesc storeDesc = new StoreDesc(LayoutType.LayoutTripleNodesHash,
              DatabaseType.MySQL);
      private final static Store store;

      static {
          JDBC.loadDriverMySQL();
          try {
              store = SDBFactory.connectStore(new SDBConnection(getDataSource()),storeDesc);
                  if (!StoreUtils.isFormatted(store)) {
                      store.getTableFormatter().create();
                  }
          } catch (SQLException ex) {
              System.err.println("Exception occured when formatting a new store: " + ex.getMessage());
              throw new RuntimeException(ex);
          }
      }

      private Model getOntModel(String modelName) {
          synchronized (store) {
              return SDBFactory.connectNamedModel(store, modelName);
          }
     }

 The problem is that in a very non-deterministic manner we get

 com.hp.hpl.jena.sdb.SDBException: Exception flushing
          com.hp.hpl.jena.sdb.layout2.TupleLoaderBase.flush(TupleLoaderBase.java:220)
          com.hp.hpl.jena.sdb.layout2.TupleLoaderBase.finish(TupleLoaderBase.java:155)
          com.hp.hpl.jena.sdb.layout2.LoaderTuplesNodes.commitTuples(LoaderTuplesNodes.java:283)
          com.hp.hpl.jena.sdb.layout2.LoaderTuplesNodes.access$100(LoaderTuplesNodes.java:31)
          com.hp.hpl.jena.sdb.layout2.LoaderTuplesNodes$Commiter.run(LoaderTuplesNodes.java:318)
          java.lang.Thread.run(Thread.java:662)
 root cause

 java.sql.BatchUpdateException: Table 'tie.NNodeQuads' doesn't exist
          com.mysql.jdbc.PreparedStatement.executeBatchSerially(PreparedStatement.java:2020)
          com.mysql.jdbc.PreparedStatement.executeBatch(PreparedStatement.java:1451)
          org.apache.commons.dbcp.DelegatingPreparedStatement.executeBatch(DelegatingPreparedStatement.java:205)
          com.hp.hpl.jena.sdb.layout2.TupleLoaderBase.flush(TupleLoaderBase.java:200)
          com.hp.hpl.jena.sdb.layout2.TupleLoaderBase.finish(TupleLoaderBase.java:155)
          com.hp.hpl.jena.sdb.layout2.LoaderTuplesNodes.commitTuples(LoaderTuplesNodes.java:283)
          com.hp.hpl.jena.sdb.layout2.LoaderTuplesNodes.access$100(LoaderTuplesNodes.java:31)
          com.hp.hpl.jena.sdb.layout2.LoaderTuplesNodes$Commiter.run(LoaderTuplesNodes.java:318)
          java.lang.Thread.run(Thread.java:662)

 What I understand from the source of TupleLoaderBase, the NNodeQuads table is only a temporary one. Thus it might be a race problem on the underlying mysql connection within SDB ?

 Do you have any idea what the problem might be ?

 Cheers,
 Petr Kremen
 KMI, Open University

-- 
The Open University is incorporated by Royal Charter (RC 000391), an exempt charity in England & Wales and a charity registered in Scotland (SC 038302).


Re: SDB exception Table 'tie.NNodeQuads' doesn't exist

Posted by Damian Steer <d....@bristol.ac.uk>.
On 12 May 2011, at 15:27, P.Kremen wrote:

> Dear all,

Hi there,

> In a web app we are using  SDB 1.3.4 with Hash layout backed by MySQL server ver. 5.1.49. For historical reasons, we are currently using only one DB connection (provided by commons-dbcp 1.4 BasicDataSource) that is wrapped to the Store object which is in turn shared and synchronized.  Thus I believe, that the following code snippet initializes and uses SDB correctly (although I am aware that this setup is definitely not optimal - if there is time in future we would like to make a more sensible refactoring with a connection pool, etc.)  - am I right ?

Without seeing getDataSource() it's not complete, but I don't see any obvious issues. As you indicate, using only one connection may not be ideal. 

>  private static final StoreDesc storeDesc = new StoreDesc(LayoutType.LayoutTripleNodesHash,
>              DatabaseType.MySQL);
>      private final static Store store;
> 
>      static {
>          JDBC.loadDriverMySQL();
>          try {
>              store = SDBFactory.connectStore(new SDBConnection(getDataSource()),storeDesc);
>                  if (!StoreUtils.isFormatted(store)) {
>                      store.getTableFormatter().create();
>                  }
>          } catch (SQLException ex) {
>              System.err.println("Exception occured when formatting a new store: " + ex.getMessage());
>              throw new RuntimeException(ex);
>          }
>      }
> 
>      private Model getOntModel(String modelName) {
>          synchronized (store) {
>              return SDBFactory.connectNamedModel(store, modelName);
>          }
>     }
> 
> The problem is that in a very non-deterministic manner

Uh-oh.

> we get
> 
> com.hp.hpl.jena.sdb.SDBException: Exception flushing
>          com.hp.hpl.jena.sdb.layout2.TupleLoaderBase.flush(TupleLoaderBase.java:220)
>          com.hp.hpl.jena.sdb.layout2.TupleLoaderBase.finish(TupleLoaderBase.java:155)
>          com.hp.hpl.jena.sdb.layout2.LoaderTuplesNodes.commitTuples(LoaderTuplesNodes.java:283)
>          com.hp.hpl.jena.sdb.layout2.LoaderTuplesNodes.access$100(LoaderTuplesNodes.java:31)
>          com.hp.hpl.jena.sdb.layout2.LoaderTuplesNodes$Commiter.run(LoaderTuplesNodes.java:318)
>          java.lang.Thread.run(Thread.java:662)
> root cause
> 
> java.sql.BatchUpdateException: Table 'tie.NNodeQuads' doesn't exist
>          com.mysql.jdbc.PreparedStatement.executeBatchSerially(PreparedStatement.java:2020)
>          com.mysql.jdbc.PreparedStatement.executeBatch(PreparedStatement.java:1451)
>          org.apache.commons.dbcp.DelegatingPreparedStatement.executeBatch(DelegatingPreparedStatement.java:205)
>          com.hp.hpl.jena.sdb.layout2.TupleLoaderBase.flush(TupleLoaderBase.java:200)
>          com.hp.hpl.jena.sdb.layout2.TupleLoaderBase.finish(TupleLoaderBase.java:155)
>          com.hp.hpl.jena.sdb.layout2.LoaderTuplesNodes.commitTuples(LoaderTuplesNodes.java:283)
>          com.hp.hpl.jena.sdb.layout2.LoaderTuplesNodes.access$100(LoaderTuplesNodes.java:31)
>          com.hp.hpl.jena.sdb.layout2.LoaderTuplesNodes$Commiter.run(LoaderTuplesNodes.java:318)
>          java.lang.Thread.run(Thread.java:662)
> 
> What I understand from the source of TupleLoaderBase, the NNodeQuads table is only a temporary one. Thus it might be a race problem on the underlying mysql connection within SDB ?

What does your loading code look like?

Obvious question: you aren't closing the store anywhere, are you?

Next obvious question: could more than one thread be accessing the store at the same time?

I see nothing wrong with what you're doing here, but it isn't a complete example. Issues with mysql jdbc drivers isn't unheard off.

Damian