oom처리
This commit is contained in:
@@ -4,14 +4,14 @@ This file provides guidance to Claude Code (claude.ai/code) when working with co
|
||||
|
||||
## Project Overview
|
||||
|
||||
Spring Boot 3.5.7 CLI application that converts PostgreSQL PostGIS spatial data to ESRI shapefiles and GeoJSON formats. The application uses **Spring Batch** for memory-efficient processing of large datasets (1M+ records) and supports automatic GeoServer layer registration via REST API.
|
||||
Spring Boot 3.5.7 / Java 21 CLI application that converts PostgreSQL PostGIS spatial data to ESRI shapefiles and GeoJSON formats. The application uses **Spring Batch** for memory-efficient processing of large datasets (1M+ records) and supports automatic GeoServer layer registration via REST API.
|
||||
|
||||
**Key Features**:
|
||||
- Memory-optimized batch processing (90-95% reduction: 2-13GB → 150-200MB)
|
||||
- Chunk-based streaming with cursor pagination (fetch-size: 1000)
|
||||
- Automatic geometry validation and type conversion (MultiPolygon → Polygon)
|
||||
- Coordinate system validation (EPSG:5186 Korean 2000 / Central Belt)
|
||||
- Dual execution modes: Spring Batch (recommended) and Legacy mode
|
||||
- Three execution modes: Spring Batch (recommended), Legacy, and GeoServer registration-only
|
||||
|
||||
## Build and Run Commands
|
||||
|
||||
@@ -25,6 +25,8 @@ Spring Boot 3.5.7 CLI application that converts PostgreSQL PostGIS spatial data
|
||||
|
||||
Output: `build/libs/shp-exporter.jar` (fixed name, no version suffix)
|
||||
|
||||
> **Note**: The `Dockerfile` currently references `shp-exporter-v2.jar` in its `COPY` step, which does not match the actual build output. Update the Dockerfile if building a Docker image.
|
||||
|
||||
### Run Application
|
||||
|
||||
#### Spring Batch Mode (Recommended)
|
||||
@@ -113,6 +115,7 @@ ConverterCommandLineRunner
|
||||
→ JdbcCursorItemReader (fetch-size: 1000)
|
||||
→ FeatureConversionProcessor (InferenceResult → SimpleFeature)
|
||||
→ StreamingShapefileWriter (chunk-based append)
|
||||
→ Step 2-1: PostShapefileUpdateTasklet (post-export DB UPDATE hook)
|
||||
→ Step 3: generateGeoJsonStep (chunk-oriented, same pattern)
|
||||
→ Step 4: CreateZipTasklet (creates .zip for GeoServer)
|
||||
→ Step 5: GeoServerRegistrationTasklet (conditional, if --geoserver.enabled=true)
|
||||
@@ -379,6 +382,21 @@ public Step myNewStep(JobRepository jobRepository,
|
||||
```
|
||||
4. **Always include `BatchExecutionHistoryListener`** to track execution metrics
|
||||
|
||||
### Post-Export DB Hook (`PostShapefileUpdateTasklet`)
|
||||
|
||||
`PostShapefileUpdateTasklet` runs immediately after `generateShapefileStep` and is designed as a placeholder for running UPDATE SQL after shapefile export (e.g., marking rows as exported). The SQL body is intentionally left as a `// TODO` — add your UPDATE statement inside `execute()`:
|
||||
|
||||
```java
|
||||
// batch/tasklet/PostShapefileUpdateTasklet.java
|
||||
int updated = jdbcTemplate.update(
|
||||
"UPDATE some_table SET status = 'EXPORTED' WHERE batch_id = ANY(?)",
|
||||
ps -> {
|
||||
ps.setArray(1, ps.getConnection().createArrayOf("bigint", batchIdList.toArray()));
|
||||
});
|
||||
```
|
||||
|
||||
Job parameters available: `inferenceId` (String), `batchIds` (comma-separated String → `List<Long>`).
|
||||
|
||||
### Modifying ItemReader Configuration
|
||||
|
||||
ItemReaders are **not thread-safe**. Each step requires its own instance:
|
||||
|
||||
Reference in New Issue
Block a user