2016-07-04 2 views
2

Je crée une fois geotools 'SimpleFeatureCollection à partir d'un fichier de forme sur le disque dur. J'appelle alors sa méthode .features() une tonne de fois. Jusqu'à présent, je croyais que c'était une bonne pratique, mais il semble ne pas l'être. Après l'appel de la méthode de fonctionnalité une fois de trop, je reçoisL'appel de SimpleFeatureCollection.features() de geotools entraîne un nombre de fois supérieur à "Nombre maximal de verrous dépassé"

Exception in thread "main" java.lang.Error: Maximum lock count exceeded 
at java.util.concurrent.locks.ReentrantReadWriteLock$Sync.fullTryAcquireShared(ReentrantReadWriteLock.java:528) 
at java.util.concurrent.locks.ReentrantReadWriteLock$Sync.tryAcquireShared(ReentrantReadWriteLock.java:488) 
at java.util.concurrent.locks.AbstractQueuedSynchronizer.acquireShared(AbstractQueuedSynchronizer.java:1282) 
at java.util.concurrent.locks.ReentrantReadWriteLock$ReadLock.lock(ReentrantReadWriteLock.java:727) 
at org.geotools.data.shapefile.files.ShpFiles.acquireRead(ShpFiles.java:358) 
at org.geotools.data.shapefile.files.ShpFiles.getReadChannel(ShpFiles.java:789) 
at org.geotools.data.shapefile.shp.ShapefileReader.<init>(ShapefileReader.java:253) 
at org.geotools.data.shapefile.ShapefileSetManager.openShapeReader(ShapefileSetManager.java:51) 
at org.geotools.data.shapefile.ShapefileFeatureSource.getReaderInternal(ShapefileFeatureSource.java:263) 
at org.geotools.data.shapefile.ShapefileFeatureStore.getReaderInternal(ShapefileFeatureStore.java:124) 
at org.geotools.data.store.ContentFeatureSource.getReader(ContentFeatureSource.java:563) 
at org.geotools.data.store.ContentFeatureCollection.features(ContentFeatureCollection.java:165) 

Comment puis-je éviter que cela se produise? Quelle est la bonne pratique de codage ici? Dois-je utiliser le fichier de forme pour créer le SimpleFeatureCollection chaque fois avant d'appeler sa méthode .features()? Toute idée serait grandement apprécié.

Répondre

2

Comme le javadocs clair, vous devez fermer un FeatureIterator après utilisation ou les ressources seront épuisées ou fuient. Vous devez utiliser un code comme celui-ci:

FeatureIterator i = featureCollection.features() 
try { 
    while(i.hasNext()){ 
     SimpleFeature feature = i.next(); 
    } 
} 
finally { 
    i.close(); 
} 
+0

Eureka! Cela l'a résolu. Merci beaucoup. Je n'ai jamais fermé un itérateur auparavant, mais il y en a toujours un premier. Est-ce que les itérateurs doivent être fermés en général, ou est-ce simplement celui-ci qui doit être fermé? – dotwin

+0

Juste ceux-ci car ils ont de vraies ressources sous eux –