{"id":19945085,"url":"https://github.com/infinispan-demos/infinispan-sqlstore-demo","last_synced_at":"2026-02-27T06:02:11.201Z","repository":{"id":85539704,"uuid":"431090139","full_name":"infinispan-demos/infinispan-sqlstore-demo","owner":"infinispan-demos","description":"SQL Store showcasing capabilities of Infinispan Table and Query caches with persistence","archived":false,"fork":false,"pushed_at":"2025-05-13T10:01:44.000Z","size":115,"stargazers_count":6,"open_issues_count":2,"forks_count":2,"subscribers_count":6,"default_branch":"main","last_synced_at":"2025-05-13T11:22:06.480Z","etag":null,"topics":["infinispan","infinispan-server","persistence","postgresql","quarkus"],"latest_commit_sha":null,"homepage":"","language":"Java","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/infinispan-demos.png","metadata":{"files":{"readme":"README.MD","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2021-11-23T12:23:03.000Z","updated_at":"2025-05-13T10:01:48.000Z","dependencies_parsed_at":null,"dependency_job_id":"f3426a90-e31d-493c-b230-43bdd8e4c951","html_url":"https://github.com/infinispan-demos/infinispan-sqlstore-demo","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/infinispan-demos/infinispan-sqlstore-demo","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/infinispan-demos%2Finfinispan-sqlstore-demo","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/infinispan-demos%2Finfinispan-sqlstore-demo/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/infinispan-demos%2Finfinispan-sqlstore-demo/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/infinispan-demos%2Finfinispan-sqlstore-demo/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/infinispan-demos","download_url":"https://codeload.github.com/infinispan-demos/infinispan-sqlstore-demo/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/infinispan-demos%2Finfinispan-sqlstore-demo/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":29887006,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-02-27T05:38:26.446Z","status":"ssl_error","status_checked_at":"2026-02-27T05:38:25.235Z","response_time":57,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.6:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["infinispan","infinispan-server","persistence","postgresql","quarkus"],"created_at":"2024-11-13T00:24:09.133Z","updated_at":"2026-02-27T06:02:11.194Z","avatar_url":"https://github.com/infinispan-demos.png","language":"Java","funding_links":[],"categories":[],"sub_categories":[],"readme":"[![Infinispan](https://design.jboss.org/infinispan/logo/final/PNG/infinispan_logo_rgb_lightbluewhite_darkblue_600px.png)](https://infinispan.org/)\n\n# Infinispan SQL Store Demo with Spring-Boot and Quarkus # \n\n## Description\n\nThis demo illustrates how to build a high-performance product catalogue \nby integrating a traditional SQL-based backend with a distributed in-memory cache using Infinispan.\n\n![retailSQLStoreDemo.png](retailSQLStoreDemo.png)\n\n* *Back-office REST API*, traditional SQL database, manages product catalogues.\n* *Front-office REST API* use Infinispan SQL Cache Stores to load and serve product catalogue and sales data directly from memory.\n\n### Retail Catalogue\n\nRetail Catalogue is a very simple Quarkus application that persists data in a Postgresql database. \n**In dev mode, runs under localhost:8080**\n\n'commands' endpoint displays the content of the database model.\n```json\n[\n    {\n        \"id\": 5,\n        \"buyer\": {\n            \"id\": 4,\n            \"country\": \"Spain\",\n            \"email\": \"mfrechilla@quarkus.io\",\n            \"name\": \"Maria Rosario Frechilla\",\n            \"phone\": \"+34 666\"\n        },\n    \"products\": [\n            {\n                \"id\": 1,\n                \"code\": \"c123\",\n                \"name\": \"Skirt Party\",\n                \"price\": 50,\n                \"stock\": 20\n            },\n            {\n                \"id\": 2,\n                \"code\": \"c456\",\n                \"name\": \"Pants Party\",\n                \"price\": 20,\n                \"stock\": 10\n            },\n            {\n                \"id\": 3,\n                \"code\": \"c789\",\n                \"name\": \"Dress Party\",\n                \"price\": 90,\n                \"stock\": 20\n            }\n            ],\n          \"promotion\": true\n        }\n]\n```\n\n### Inmemory Catalogue\n\nThere are two implementations of the service:\n* Quarkus version : *inmemory-catalogue-quarkus*\n* Spring Boot 3 version: *inmemory-catalogue-spring-boot*\n\n#### Overall Description\n\nInmemory Catalogue creates two SQL Cache Stores with Infinispan on startup. \n1. `catalogue-table-store` is a table sql store persisted cache that maps to the RetailProduct table\n2. `sold-products-query-store`is a query sql store persisted cache that joins information across multiple tables.\n\nBoth caches use indexing.\n\nThe application exposes 3 endpoints:\n* `catalogue`: Lists the catalogue content. Can filter by name, stock units and prices using query parameters.\n* `catalogue/{code}`: Displays the catalogue product by code\n* `sales`: Lists the  products than have been sold. Filter can be done name of the product and country.\n\n## Dev mode \n\n* Run Infinispan and Postgresql in the same network with docker\n\n```shell\ndocker-compose up\n```\n\n### Quarkus\nDev services are disabled since the Infinispan and Postresql need to be in the same\ndocker network and Infinispan access the Postgresql database directly to load the data\ninto the caches.\n\nThe application runs in localhost:8180\n\n* Run Retail Catalogue and Store\n\n```shell\ncd infinispan-sqlstore-demo/retail-catalogue \n./mvnw quarkus:dev \n```\n\n* Run Infinispan In-memory catalogue\n```shell\ncd infinispan-sqlstore-demo/inmemory-catalogue-quarkus \n./mvnw quarkus:dev \n```\n\n### Spring Boot\n\nThe application runs in localhost:8180.\n\n* Run Retail Catalogue and Store\n\n```shell\ncd infinispan-sqlstore-demo/retail-catalogue \n./mvnw quarkus:dev \n```\n\n* Run Infinispan In-memory catalogue \n```shell\ncd infinispan-sqlstore-demo/inmemory-catalogue-spring-boot\n./mvnw spring-boot:run \n```\n\n## Links\n\nAdditional resources and useful links:\n\n* [Infinispan Query and Indexing Guide](https://infinispan.org/docs/stable/titles/query/query.htm)\n* [Infinispan SQL Cache Storage Documentation](https://infinispan.org/docs/stable/titles/configuring/configuring.html#sql-cache-store_persistence)\n* [Quarkus Infinispan Extension](https://quarkus.io/guides/infinispan-client)\n\n## Deploy Minikube\n\n1. Install and start Minikube\n```shell\n minikube start --driver=virtualbox --cpus 4 --memory \"8192mb\"\n```\n\n2. Create Kubernetes Secret `sqlstore-credentials`\n```shell\nkubectl create secret generic sqlstore-credentials --from-literal=db-username=infinispan --from-literal=db-password=secret --from-literal=infinispan-username=admin --from-literal=infinispan-password=secret\n```\n\n3. Deploy Postgresql\n```shell\nkubectl apply -f deploy/postgres.yaml\n```\n\n4. Build and deploy Retail Catalogue\n```shell\neval $(minikube -p minikube docker-env)\ncd retail-catalogue\n .mvnw clean package -Dquarkus.kubernetes.deploy=true -DskipTests=true \n\n# Export the service URL \nexport RETAIL_CATALOGUE=$(minikube service --url retail-store-service) \n\n# Check the commands endpoint \ncurl $RETAIL_CATALOGUE/commands\n```\n\n5. Install the Infinispan Operator\n```shell\ncurl -sL https://github.com/operator-framework/operator-lifecycle-manager/releases/download/v0.31.0/install.sh | bash -s v0.31.0\nkubectl create -f https://operatorhub.io/install/infinispan.yaml\nkubectl get csv -n operators\n```\n\nYou should see something like\n```shell\nNAME                          DISPLAY               VERSION   REPLACES                      PHASE\ninfinispan-operator.v2.4.12   Infinispan Operator   2.4.12    infinispan-operator.v2.4.11   Succeeded\n```\n\n6. Create Infinispan identities secret\n```shell\nkubectl create secret generic --from-file=identities.yaml connect-secret\n```\n\n7. Deploy infinispan server\n```shell\nkubectl apply -f infinispan.yaml\n```\n\nYou should see something like the following list\n\n```shell\n minikube service list    \n                                                                                    15:17:03\n|-------------|-----------------------|--------------|-----------------------------|\n|  NAMESPACE  |         NAME          | TARGET PORT  |             URL             |\n|-------------|-----------------------|--------------|-----------------------------|\n| default     | infinispan            | No node port |\n| default     | infinispan-admin      | No node port |\n| default     | infinispan-external   |        11222 | http://192.168.59.101:30000 |\n| default     | infinispan-ping       | No node port |\n| default     | kubernetes            | No node port |\n| default     | postgres              | http/5432    | http://192.168.59.101:31684 |\n| default     | retail-store-service  | http/80      | http://192.168.59.101:31056 |\n| kube-system | kube-dns              | No node port |\n| olm         | operatorhubio-catalog | No node port |\n| olm         | packageserver-service | No node port |\n|-------------|-----------------------|--------------|-----------------------------|\n\n```\n\n8. Build and deploy Inmemory Catalogue Quarkus\n```shell\neval $(minikube -p minikube docker-env)\ncd inmemory-catalogue-quarkus\n./mvnw clean package -Dquarkus.kubernetes.deploy=true -DskipTests=true \n\n# Export the service URL \nexport INMEMORY_CATALOGUE=$(minikube service --url inmemory-catalogue-service) \n\ncurl $INMEMORY_CATALOGUE\n```","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Finfinispan-demos%2Finfinispan-sqlstore-demo","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Finfinispan-demos%2Finfinispan-sqlstore-demo","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Finfinispan-demos%2Finfinispan-sqlstore-demo/lists"}