2017-08-18 1 views
0

J'utilise Apache Jena Api sur base de données SQL (serveur sql microsoft) connu AS JENA SDB J'ai un problème quand je veux accéder à la base de données de manière trensactionnelle. Lorsque j'utilise Jena Les transactions TDB sont prises en charge mais lorsque j'utilise JENA TDB de façon stras- tinale java.lang.UnsupportedOperationException: Transactions non prises en charge exception levée.Apache Jena SDB Transactions support

Snippet de Jena TDB qui travaille est la suivante:

Dataset dataset = return TDBFactory.createDataset("datasetLocation"); 
dataset.begin(ReadWrite.WRITE); 
//... 

Snippet du SDB Jena qui ne fonctionne pas est la suivante:

StoreDesc storeDesc = new StoreDesc(LayoutType.LayoutTripleNodesHash, 
    DatabaseType.SQLServer); 
    SDBConnection sdbConn = new SDBConnection(getConnection()); 
    Store store = StoreFactory.create(storeDesc, sdbConn); 
    Dataset dataset =DatasetStore.create(store); 
    dataset.begin(ReadWrite.WRITE); 
    //...this throws the exception 

Ma question est depuis mon exigence était de migrer de TDB à SDB (je sais qu'il n'est pas recommandé) est-il un moyen d'utiliser Jena SDB de manière transactionnelle

Répondre

0

Il est toujours transactionnel - par par défaut, c'est autocommit qui peut être très cher.

Vous pouvez manipuler le paramètre connexion JDBC directement, ou utilisez TransactionHandler de tout modèle parce que tous les modèles de la même carte de jeu de données au même code pour agir sur la connexion JDBC, qui est également disponible:

Store.getConnection().getTransactionHandler()

+0

Votre solution consiste donc à exécuter commit/rollback directement sur la connexion jdbc comme: store.getConnection(). GetSqlConnection(). SetAutoCommit (false); store.getConnection(). GetSqlConnection(). Commit(); ou en utilisant un gestionnaire de transaction, veuillez le confirmer. Mon idée était d'utiliser dataset.begin (ReadWrite.WRITE); dataset.commit(); depuis Dataset est une interface commune pour TDB et SDB et de cette façon je peux utiliser les deux en fonction des besoins. Seemes like DatasetGraphSDB qui est implémentation Dataset dans SDB ne prend pas en charge les transactions. –

+0

Correct - SDB ne prend pas en charge les transactions Dataset (il les a précédées). – AndyS

+0

Que pour votre réponse.Mon dernier doute est-ce que je devrais utiliser Jena mécanisme de verrouillage de lecture/écriture comme model.enterCriticalSection lors de l'utilisation des transactions jdbc dans SDB (comme indiqué dans le commentaire précédent) ou JDBC transactioin niveau d'isolement est suffisant pour résoudre les problèmes de lecteurs/écrivains . –