2016-07-04 5 views
2

geotools 'SimpleFeatureCollection을 HDD의 모양 파일에서 한 번 만듭니다. 그런 다음 .features() 메서드를 여러 번 호출합니다. 지금까지 나는 이것이 훌륭한 습관이라고 믿었지만 그렇지 않은 것으로 보인다. 피쳐 메서드를 너무 많이 호출 한 후geotools의 SimpleFeatureCollection.features()를 한 번 이상 호출하면 "최대 잠금 횟수가 초과되었습니다"

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) 

어떻게 이런 일이 발생하지 않도록 할 수 있습니까? 좋은 코딩 방법은 무엇입니까? 메서드를 호출하기 전에 매번 SimpleFeatureCollection을 만들기 위해 모양 파일을 사용해야합니까? 어떤 통찰력이라도 대단히 감사하겠습니다.

답변

2

javadocs은 사용 후 FeatureIterator을 닫아야합니다. 그렇지 않으면 자원이 고갈되거나 유출됩니다. 다음과 같은 코드를 사용해야합니다.

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

유레카! 이것으로 해결했습니다. 고맙습니다. 전에 반복기를 닫은 적은 없지만 항상 첫 번째가 있습니다. 반복자는 일반적으로 닫히는가, 아니면 닫는 것을 요구하는 바로 그 것인가? – dotwin

+0

그들은 실제 자원을 가지고 있기 때문에 이것들을 가지고 있습니다. –