ODP.NET connection pooling: How to tell if a connection has been used

后端 未结 3 1398
礼貌的吻别
礼貌的吻别 2020-12-20 00:17

I\'m modifying a Winforms app to use connection pooling so data access can occur in background threads. The business logic is implemented in PL/SQL and there are a couple of

相关标签:
3条回答
  • 2020-12-20 00:57

    If what you need is to just know whether you ever had some connections not come from pool but a fresh new one, I think that you can use the HardConnectsPerSecond and SoftconnectsPerSecond performance counter provided by ODP.NET.

    This won't tell you exactly which OracleConnection.Open() leads to a hard connection, though. I was also thinking about combining other ODP.NET perf counter to determine if a new hard connection is created, but after some experiments this is not easy because ODP.NET will also purge connections every three minutes (depending on the Decr Pool Size setting).

    0 讨论(0)
  • 2020-12-20 00:58

    ADO.NET manages a connection pool for you. It's even configurable. Why would you ever try to track these connections yourself?

    http://msdn.microsoft.com/en-us/library/bb399543.aspx

    And, specifically for Oracle:

    http://msdn.microsoft.com/en-us/library/ms254502.aspx

    The .NET Framework Data Provider for Oracle provides connection pooling automatically for your ADO.NET client application. You can also supply several connection string modifiers to control connection pooling behavior (see "Controlling Connection Pooling with Connection String Keywords," later in this topic).

    Pool Creation and Assignment

    When a connection is opened, a connection pool is created based on an exact matching algorithm that associates the pool with the connection string in the connection. Each connection pool is associated with a distinct connection string. When a new connection is opened, if the connection string is not an exact match to an existing pool, a new pool is created.

    Once created, connection pools are not destroyed until the active process ends. Maintaining inactive or empty pools uses very few system resources.

    BTW, I guess I'm not totally hip on all the OracleClient changes that have been going on. It seems like Microsoft may be dropping support? Last I knew ODP.NET was based on ADO.NET... but, even if I'm mistaken about that, ODB.NET claims to support connection pooling out of the box as well:

    http://download.oracle.com/docs/html/E10927_01/featConnecting.htm#CJAFIDDC

    0 讨论(0)
  • 2020-12-20 00:59

    The connection pooling provided by ODP.NET is completely opaque. That is, it isn't leaky in the way I'd like it to be - there is no way of knowing if a connection has been used before or is brand new. However it is a leaky abstraction in another way: Any session state (e.g. package scoped variables, which are session scoped) is preserved between usages of the connection. Since this is a question about determining the used vs. new state of a connection without going to the database, the answer is that it simply cannot be done using ODP.NET's built-in connection pool.

    That leaves two options:

    1. Create a connection pool implementation that either provides that information or performs user-defined initialisation upon creation of each new connection; or
    2. Perform a round-trip to the database to determine the used vs. new state of the connection.
    0 讨论(0)
提交回复
热议问题