diff --git a/pet_clinic_insurance_service/pet_clinic_insurance_service/settings.py b/pet_clinic_insurance_service/pet_clinic_insurance_service/settings.py index b159fb30..06fd57d4 100644 --- a/pet_clinic_insurance_service/pet_clinic_insurance_service/settings.py +++ b/pet_clinic_insurance_service/pet_clinic_insurance_service/settings.py @@ -117,6 +117,14 @@ def get_secret_value(secret_name: str, region_name: str) -> str: "PASSWORD": DB_PASSWORD, "HOST": os.environ.get("DB_SERVICE_HOST"), "PORT": os.environ.get("DB_SERVICE_PORT"), + # Database connection pool optimization + "CONN_MAX_AGE": 600, # Keep connections alive for 10 minutes + "OPTIONS": { + "MAX_CONNS": 20, # Maximum number of connections + "MIN_CONNS": 5, # Minimum number of connections + "connect_timeout": 10, # Connection timeout in seconds + "options": "-c default_transaction_isolation=read_committed" + } } } @@ -138,6 +146,11 @@ def get_secret_value(secret_name: str, region_name: str) -> str: 'level': 'INFO', 'propagate': True, }, + 'django.db.backends': { + 'handlers': ['console'], + 'level': 'WARNING', # Log slow queries + 'propagate': False, + }, }, } @@ -180,4 +193,4 @@ def get_secret_value(secret_name: str, region_name: str) -> str: # Default primary key field type # https://docs.djangoproject.com/en/5.0/ref/settings/#default-auto-field -DEFAULT_AUTO_FIELD = "django.db.models.BigAutoField" +DEFAULT_AUTO_FIELD = "django.db.models.BigAutoField" \ No newline at end of file diff --git a/spring-petclinic-customers-service/src/main/java/org/springframework/samples/petclinic/customers/model/OwnerRepository.java b/spring-petclinic-customers-service/src/main/java/org/springframework/samples/petclinic/customers/model/OwnerRepository.java index aa720f24..ae272cb5 100644 --- a/spring-petclinic-customers-service/src/main/java/org/springframework/samples/petclinic/customers/model/OwnerRepository.java +++ b/spring-petclinic-customers-service/src/main/java/org/springframework/samples/petclinic/customers/model/OwnerRepository.java @@ -16,6 +16,9 @@ package org.springframework.samples.petclinic.customers.model; import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.jpa.repository.Modifying; +import org.springframework.data.jpa.repository.Query; +import org.springframework.transaction.annotation.Transactional; /** * Repository class for Owner domain objects All method names are compliant with Spring Data naming @@ -27,4 +30,14 @@ * @author Michael Isvy * @author Maciej Szarlinski */ -public interface OwnerRepository extends JpaRepository { } +public interface OwnerRepository extends JpaRepository { + + /** + * Custom delete method to prevent StackOverflowError in deleteAllInBatch + * Uses native SQL to avoid Hibernate HQL parsing issues + */ + @Modifying + @Transactional + @Query(value = "DELETE FROM owners", nativeQuery = true) + void deleteAllOwners(); +} \ No newline at end of file diff --git a/spring-petclinic-customers-service/src/main/resources/application.yml b/spring-petclinic-customers-service/src/main/resources/application.yml index 26e1025f..5ffb2407 100644 --- a/spring-petclinic-customers-service/src/main/resources/application.yml +++ b/spring-petclinic-customers-service/src/main/resources/application.yml @@ -4,6 +4,18 @@ spring: config: import: optional:configserver:${CONFIG_SERVER_URL:http://localhost:8888/} +# HTTP client timeout configuration to prevent ResourceAccessException +server: + tomcat: + connection-timeout: 60000 # 60 seconds + keep-alive-timeout: 60000 + +# RestTemplate and WebClient timeout configuration +rest: + client: + connection-timeout: 30000 # 30 seconds + read-timeout: 60000 # 60 seconds + eureka: instance: preferIpAddress: true @@ -16,6 +28,7 @@ logging: root: OFF org.springframework.samples.petclinic.customers.web.PetResource: INFO org.springframework.samples.petclinic.customers.aws.SqsService: FATAL + org.springframework.web.client.RestTemplate: WARN # Log HTTP client errors pattern: level: trace_id=%mdc{trace_id} span_id=%mdc{span_id} trace_flags=%mdc{trace_flags} %5p