Class PostgresResourceNoProcDAO

  • All Implemented Interfaces:
    FHIRDbDAO, ResourceDAO

    public class PostgresResourceNoProcDAO
    extends ResourceDAOImpl
    Data access object for writing FHIR resources to a PostgreSQL database. Like the Derby implementation, this version uses individual SQL statements instead of a stored procedure and is useful for debugging performance and/or concurrency issues. It should not be used in production scenarios because the numerous app-database round-trips slow things down considerably.
    • Method Detail

      • storeResource

        public long storeResource​(java.lang.String tablePrefix,
                                  java.util.List<ExtractedParameterValue> parameters,
                                  java.lang.String p_logical_id,
                                  java.io.InputStream p_payload,
                                  java.sql.Timestamp p_last_updated,
                                  boolean p_is_deleted,
                                  java.lang.String p_source_key,
                                  java.lang.Integer p_version,
                                  java.lang.String p_parameterHashB64,
                                  java.sql.Connection conn,
                                  ParameterDAO parameterDao,
                                  java.lang.Integer ifNoneMatch,
                                  java.lang.String resourcePayloadKey,
                                  java.util.concurrent.atomic.AtomicInteger outInteractionStatus,
                                  java.util.concurrent.atomic.AtomicInteger outIfNoneMatchVersion)
                           throws java.lang.Exception
        Store the resource in the database, creating a new logical_resource entry if this is the first version of this resource, or creating a new resource entry if this a new version of an existing logical resource. The logic tracks closely the DB2 stored procedure implementation, including locking of the logical_resource and handling concurrency issues using the standard insert-or-update pattern:
           SELECT FOR UPDATE                 -- try and get a write lock
           IF NOT FOUND THEN                 -- doesn't exist, so we don't have a lock
             INSERT new logical resource     -- create the record - if OK, we own the lock
             IF DUPLICATE THEN               -- someone else beat us to the create
               SELECT FOR UPDATE             -- so we need to try again for a write lock
             ...
           ...
         
        This works because we never delete a logical_resource record, and so don't have to deal with concurrency issues caused when deletes are mingled with inserts/updates Note the execution flow aligns very closely with the DB2 stored procedure implementation (fhir-persistence-schema/src/main/resources/add_any_resource.sql)
        Parameters:
        tablePrefix -
        parameters -
        p_logical_id -
        p_payload -
        p_last_updated -
        p_is_deleted -
        p_source_key -
        p_version -
        p_parameterHashB64 -
        conn -
        parameterDao -
        Returns:
        the resource_id for the entry we created
        Throws:
        java.lang.Exception
      • getResourceTypeId

        protected java.lang.Integer getResourceTypeId​(java.lang.String resourceTypeName,
                                                      java.sql.Connection conn)
                                               throws java.sql.SQLException
        Read the id for the named type
        Parameters:
        resourceTypeName -
        Returns:
        the database id, or null if the named record is not found
        Throws:
        java.sql.SQLException
      • getOrCreateResourceType

        public int getOrCreateResourceType​(java.lang.String resourceTypeName,
                                           java.sql.Connection conn)
                                    throws java.sql.SQLException
        stored-procedure-less implementation for managing the resource_types table
        Parameters:
        resourceTypeName -
        Throws:
        java.sql.SQLException