Skip to content

Consider adding Oracle support #45

Closed

Description

@madelson

Activity

  1. madelson commented on Sep 29, 2020

    @madelson
    OwnerAuthor

    May be easier after appveyor/ci#31

  2. odin568 commented on Oct 27, 2021

    @odin568

    Would love to see someday 😀

  3. madelson commented on Oct 27, 2021

    @madelson
    OwnerAuthor

    @odin568 what has held me back in the past is not having a good way to install an Oracle db on my windows machine for doing development. Do you know if this is now supported or do you have another recommended workflow for this?

  4. odin568 commented on Oct 28, 2021

    @odin568

    What should Work is Bildung a docker Container and Run it locally, as described here:
    https://github.com/oracle/docker-images/tree/main/OracleDatabase/SingleInstance
    Did that in the past for testing

  5. madelson commented on Oct 31, 2021

    @madelson
    OwnerAuthor

    Ok I think I have a basic local setup working:

    Container start command:

    docker run --name oracle-distributed-lock -p 1521:1521 -p 5500:5500 -e ORACLE_PWD=???? oracle/database:18.4.0-xe
    

    C# snippet:

    var cs = new OracleConnectionStringBuilder {
    	UserID = "SYSTEM",
    	Password = ????,
    	DataSource = "(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=localhost)(PORT=1521))(CONNECT_DATA=(SERVICE_NAME=XE)))"
    };
    var conn = new OracleConnection(cs.ConnectionString);
    conn.Open();
    
    var command = conn.CreateCommand();
    command.Parameters.Add(new OracleParameter("lockName", OracleDbType.Varchar2) { Value = "test" });
    var outputParameter = new OracleParameter("returnCode", OracleDbType.Int32, ParameterDirection.Output);
    command.Parameters.Add(outputParameter);
    command.CommandText = @"
    DECLARE
    	lockHandle VARCHAR2(128);
    BEGIN	
    	DBMS_LOCK.ALLOCATE_UNIQUE(:lockName, lockHandle);
    	:returnCode := DBMS_LOCK.REQUEST(
    		lockHandle,
    		DBMS_LOCK.X_MODE
    	);
    END;";
    command.ExecuteNonQuery();
    outputParameter.Value.Dump();
    
  6. odin568 commented on Oct 31, 2021

    @odin568

    I am Happy to Support you with Testing, Just Ping me

  7. madelson commented on Oct 31, 2021

    @madelson
    OwnerAuthor

    Thanks @odin568 that would be great. It will take me a bit to actually code up the implementation but I'll let you know when a prerelease is available.

    In the meantime, if you happen to know how to query for idle sessions (connections that are open but not doing running any commands) in Oracle that would be super helpful; I'll need it for my testing.

  8. odin568 commented on Oct 31, 2021

    @odin568

    There are two main global tables which should have the information: gv$session s, v$process
    Found here a page with good examples. Hope that helps :-)

  9. madelson commented on Nov 5, 2021

    @madelson
    OwnerAuthor

    Thanks @odin568!

    Another Oracle question for you: do you typically call OracleCommand.Prepare() before executing commands? For some database drivers this is important while for others it isn't.

  10. odin568 commented on Nov 5, 2021

    @odin568

    No, you don't need it, does not have any effect, see https://docs.oracle.com/html/E10927_01/OracleCommandClass.htm
    This method is a no-op
    Another source: https://stackoverflow.com/a/33667968

  11. madelson commented on Nov 5, 2021

    @madelson
    OwnerAuthor

    Running into issues getting command cancellation to work properly, see oracle/dotnet-db-samples#211

  12. odin568 commented on Nov 6, 2021

    @odin568

    Hmm... Is the answer there a Blocker?

  13. madelson commented on Nov 16, 2021

    @madelson
    OwnerAuthor

    @odin568 sorry thought I had replied here earlier. No it is not a blocker and I'm continuing to progress with the implementation.

    However, this will limit the functionality somewhat. The main thing we lose is the ability to cancel lock requests which is pretty valuable. As a workaround for that, I'm thinking of implementing longer lock requests using a loop with chances to check the cancellation token in between.

  14. madelson commented on Dec 11, 2021

    @madelson
    OwnerAuthor

    Update on this:

    While I did get oracle working on my machine through docker, I've found the docker-based oracle to be incredibly unreliable. I have to restart the database frequently and constantly encounter issues like connection timeouts. Perhaps there is a fix for this (e. g. some configuration I'm missing). I'd be happy to try things but for now that is blocking further progress.

    The other avenue I'm exploring is using oracle cloud's free tier. Unfortunately that is running into issues as well (see oracle/dotnet-db-samples#225). EDIT: Looks like this direction is promising.

    For future reference, work done is here: https://github.com/madelson/DistributedLock/compare/oracle?expand=1

  15. madelson commented on Dec 13, 2021

    @madelson
    OwnerAuthor

    @odin568 I've published a beta release of the Oracle package here: https://www.nuget.org/packages/DistributedLock.Oracle/1.0.0-beta001 . Can you try it out in your environment?

    Thanks!

  16. odin568 commented on Dec 13, 2021

    @odin568

    Will do this week! Thank you!

  17. added this to the 2.3 milestone on Dec 14, 2021
  18. odin568 commented on Dec 16, 2021

    @odin568

    So first the good thing: On one schema I have on one of our oracles, it works great.

    On the same database, different schema, I get

    Unhandled exception. Oracle.ManagedDataAccess.Client.OracleException (0x80004005): ORA-06550: line 5, column 21:
    PLS-00201: identifier 'SYS.DBMS_LOCK' must be declared
    ORA-06550: line 5, column 21:
    PL/SQL: Statement ignored
    

    I think i would need to grant something like

    connect as sys
    grant execute on SYS.DBMS_LOCK to someuser;

    The schema where it works is our historic "god" schema. Newer stuff we build more modular and have dedicated schemas with only the rights needed. So probably that is something to resolve on my end, but perhaps a topic for documentation.

    So far thanks a lot - will make some more tests but it looks promising!!

  19. madelson commented on Dec 17, 2021

    @madelson
    OwnerAuthor

    Thanks for testing @odin568 ! From some quick googling I found https://stackoverflow.com/questions/10870787/oracle-pl-sql-dbms-lock-error which suggests that your solution to the permissions issue is the correct one.

    I've added this section to the Oracle docs: https://github.com/madelson/DistributedLock/blob/oracle/docs/DistributedLock.Oracle.md#setup

    I'll aim to publish a stable version of the package tomorrow!

  20. madelson commented on Dec 17, 2021

    @madelson
    OwnerAuthor

    Released in DistributedLock.Oracle 1.0.0 / DistributedLock 2.3.0

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Projects

    No projects

      Milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions