473,372 Members | 1,067 Online
Bytes | Software Development & Data Engineering Community
Post Job

Home Posts Topics Members FAQ

Join Bytes to post your question to a community of 473,372 software developers and data experts.

Regarding Connection object behaviour

Hi ,

I am using OracleConnection object from Oracle ODP.net provider and
following is the behaviour which i am finding bit strange :

To start with my argument is based on followings facts :

1. Connection object is a reference type object .
2. All reference types are passed by reference even when done without
using modifier like ref / out .

Have a look at the following code :

Class A
{
OracleConnection conn ; // class variable

public static void Main()
{
A a = new A() ;
string connectionString = <StandardStuff> ; // Pooling false
a.c(connectionString);

connectionString = <StandardStuff> ; // Pooling true
a.c(connectionString);
}

public void c(string connectionString)
{
try
{
// Get a connection string

if(conn == null)
conn = new OracleConnection(connectionString)
else
conn.ConnectionString = connectionString ;

conn.Open() ;

CloseandDispose(conn,<Pooling Attrbute Value from connection
string>) ;
}
catch(OracleException ex)
{
// print exception message
}
catch(Exception ex)
{
// print exception message
}

}

public void CloseandDispose(OracleConnection conn,bool flag)
{
conn.Close() ;

if(!flag)
{
conn.dispose();
conn = null ;
}
}
}

Now in above mentioned code :

Case 1 : (OracleException)
========

When conn object is class variable and method c is called from second
time from main method after changing Connection String then it leads to
exception .

Reason is --> during first call when CloseandDispose method is called ,
it enters the loop to dispose and nullify the connection object but
second time when method c is called it doesn't validates the condition
conn = null and when it goes down and tries to open connection , then it
leads to exception :

"Can't open a connection object already disposed"

Now there are cases when exception doesn't happen i.e :

Case 2: --> I pass Oracleconnection objects between methods using ref
keyword and operation is successful .

Case 3 --> Don't use OracleConnection object in CloseAndDispose method
and it will nullify class object and valiadte conn = nul condition .

Case 4 --> Declare OracleConnection as a local variable in main method
and pass it in all methods and even then it success .

Now in present scenario it seems to be an issue with Connection object
as Case 1 also should have been successful .

Share your comments , in case you need some other specific details let
me know that .

thanks ,

Mrinal

Feb 20 '06 #1
7 2185
Mrinal,
It isn't very clear what exactly the objective of your exercise is, but it
might help to point out that connection pooling is based on the unique
connection string. In other words, with pooling on, if you use a different
connection string, a new connection will be created instead of a matching one
being returned from the pool.

The best pattern to use in almost all cases is to open a connection just
before use, do your work, and close or Dispose the connection immediately
afterward, and to leave pooling true (the default).

The code you present where you have separated out the different portiions
such as your "CloseAndDispose" method is somewhat non-standard.

--Peter

--
Co-founder, Eggheadcafe.com developer portal:
http://www.eggheadcafe.com
UnBlog:
http://petesbloggerama.blogspot.com


"Mrinal Kamboj" wrote:
Hi ,

I am using OracleConnection object from Oracle ODP.net provider and
following is the behaviour which i am finding bit strange :

To start with my argument is based on followings facts :

1. Connection object is a reference type object .
2. All reference types are passed by reference even when done without
using modifier like ref / out .

Have a look at the following code :

Class A
{
OracleConnection conn ; // class variable

public static void Main()
{
A a = new A() ;
string connectionString = <StandardStuff> ; // Pooling false
a.c(connectionString);

connectionString = <StandardStuff> ; // Pooling true
a.c(connectionString);
}

public void c(string connectionString)
{
try
{
// Get a connection string

if(conn == null)
conn = new OracleConnection(connectionString)
else
conn.ConnectionString = connectionString ;

conn.Open() ;

CloseandDispose(conn,<Pooling Attrbute Value from connection
string>) ;
}
catch(OracleException ex)
{
// print exception message
}
catch(Exception ex)
{
// print exception message
}

}

public void CloseandDispose(OracleConnection conn,bool flag)
{
conn.Close() ;

if(!flag)
{
conn.dispose();
conn = null ;
}
}
}

Now in above mentioned code :

Case 1 : (OracleException)
========

When conn object is class variable and method c is called from second
time from main method after changing Connection String then it leads to
exception .

Reason is --> during first call when CloseandDispose method is called ,
it enters the loop to dispose and nullify the connection object but
second time when method c is called it doesn't validates the condition
conn = null and when it goes down and tries to open connection , then it
leads to exception :

"Can't open a connection object already disposed"

Now there are cases when exception doesn't happen i.e :

Case 2: --> I pass Oracleconnection objects between methods using ref
keyword and operation is successful .

Case 3 --> Don't use OracleConnection object in CloseAndDispose method
and it will nullify class object and valiadte conn = nul condition .

Case 4 --> Declare OracleConnection as a local variable in main method
and pass it in all methods and even then it success .

Now in present scenario it seems to be an issue with Connection object
as Case 1 also should have been successful .

Share your comments , in case you need some other specific details let
me know that .

thanks ,

Mrinal

Feb 20 '06 #2
Hi Mrinal,

Thanks for your post!

As Peter mentioned, the pattern for manipulation of connection is simple.
We can open a new connection and do some work. If we need use this
connection in other portion, we don't need to close and dispose the
connection. In opposite situation, we don't want to use the connection
again, please just call close method for the connection. Actually, based on
my experience, we can not call dispose method.

I appreciate your understanding! If you have anything unclear, please feel
you free to let me know.

Regards,

Yuan Ren [MSFT]
Microsoft Online Support
================================================== ====
PLEASE NOTE the newsgroup SECURE CODE and PASSWORD were
updated on February 14, 2006. Please complete a re-registration process
by entering the secure code mmpng06 when prompted. Once you have
entered the secure code mmpng06, you will be able to update your profile
and access the partner newsgroups.
================================================== ====
When responding to posts, please "Reply to Group" via your newsreader
so that others may learn and benefit from this issue.
================================================== ====
This posting is provided "AS IS" with no warranties, and confers no rights.
================================================== ====

Feb 21 '06 #3
Hi Peter ,

Idea is like this :

Code that , i have pasted is part of a test suite , which tests
OracleConnectionStringBuilder introduced as a part of ADO.net 2.0 .

Now , logic behind calling method C twice from the main method is that
connection string builder class is used to change connection string at
runtime , where it changes the pooling attribute and reconnect .

Now initially when Connection is created in Pooling = false mode then i
make sure that after closing connection object is disposed and nullified
, however in case of Pooling = true it's just closed , so that it can
return to connection pool .

Reason for implementing a separate CloseAndDispose method is that in
original test suite , conn object and the CloseAndDispose method are
part of a base class , as multiple derived classes uses same object and
finally any of them can close and dispose , so essentially a method is
implemented in base class to complete the task .

Now as the question goes , point of confusion for me remains that in
case 1 , when i am passing the conn object without any ref / out it
gives me the exception as mentioned earlier but in other cases it
doesn't , which is bit strange and could be a possible issue with
Connection object .

Any comments regarding the behaviour .

If you need some more explanation , let me know that .

thanks ,

Mrinal

Peter Bromberg [C# MVP] wrote:
Mrinal,
It isn't very clear what exactly the objective of your exercise is, but it
might help to point out that connection pooling is based on the unique
connection string. In other words, with pooling on, if you use a different
connection string, a new connection will be created instead of a matching one
being returned from the pool.

The best pattern to use in almost all cases is to open a connection just
before use, do your work, and close or Dispose the connection immediately
afterward, and to leave pooling true (the default).

The code you present where you have separated out the different portiions
such as your "CloseAndDispose" method is somewhat non-standard.

--Peter

Feb 21 '06 #4
Hi Yuan ,

Are you saying that , in any case and scenario , there's no need to call
dispose on connection object , just close will do the job , whether
it's pooling true / false mode .

Even when Classes like OracleConnection has lot of unmanaged code
underlying it , since it's implemented using Oracle's native call
interfaces .

What , i knew was if dispose method is available for a class and there's
no need to use it further , then it should be used as it releases the
unmanaged references which are beyond the purview of GC .

Let me know your views regarding same ,

regards ,

Mrinal

Yuan Ren[MSFT] wrote:
Hi Mrinal,

Thanks for your post!

As Peter mentioned, the pattern for manipulation of connection is simple.
We can open a new connection and do some work. If we need use this
connection in other portion, we don't need to close and dispose the
connection. In opposite situation, we don't want to use the connection
again, please just call close method for the connection. Actually, based on
my experience, we can not call dispose method.

I appreciate your understanding! If you have anything unclear, please feel
you free to let me know.

Regards,

Yuan Ren [MSFT]
Microsoft Online Support
================================================== ====
PLEASE NOTE the newsgroup SECURE CODE and PASSWORD were
updated on February 14, 2006. Please complete a re-registration process
by entering the secure code mmpng06 when prompted. Once you have
entered the secure code mmpng06, you will be able to update your profile
and access the partner newsgroups.
================================================== ====
When responding to posts, please "Reply to Group" via your newsreader
so that others may learn and benefit from this issue.
================================================== ====
This posting is provided "AS IS" with no warranties, and confers no rights.
================================================== ====

Feb 21 '06 #5
Hi Mrinal,

Thanks for your reply!

As far as I know, the dipose method just marks a flag for the GC. Whether
the connection needs to be released is determined the GC system or
connection pool, even for the oracle client.

The best practice is using the "using" statement in the code as below:
using (Connection c = new Connection())
{
//do some work
}

Hope this will be helpful!

Regards,

Yuan Ren [MSFT]
Microsoft Online Support
================================================== ====
PLEASE NOTE the newsgroup SECURE CODE and PASSWORD were
updated on February 14, 2006. Please complete a re-registration process
by entering the secure code mmpng06 when prompted. Once you have
entered the secure code mmpng06, you will be able to update your profile
and access the partner newsgroups.
================================================== ====
When responding to posts, please "Reply to Group" via your newsreader
so that others may learn and benefit from this issue.
================================================== ====
This posting is provided "AS IS" with no warranties, and confers no rights.
================================================== ====

Feb 23 '06 #6
Hi yuan ,

I think marking a flag for GC is the job of the finalizer , which
implements a separate queue for this than dispose , which is meant for
relasing underlying unmanaged references explicitly .

Best practice , i do understand , but my motive was to ensure that what
i was doing is correct and there could be a possible issue with ODP.net
implementation , as i had found through another thread in ADO.net group .

thanks ,

Mrinal

Yuan Ren[MSFT] wrote:
Hi Mrinal,

Thanks for your reply!

As far as I know, the dipose method just marks a flag for the GC. Whether
the connection needs to be released is determined the GC system or
connection pool, even for the oracle client.

The best practice is using the "using" statement in the code as below:
using (Connection c = new Connection())
{
//do some work
}

Hope this will be helpful!

Regards,

Yuan Ren [MSFT]
Microsoft Online Support
================================================== ====
PLEASE NOTE the newsgroup SECURE CODE and PASSWORD were
updated on February 14, 2006. Please complete a re-registration process
by entering the secure code mmpng06 when prompted. Once you have
entered the secure code mmpng06, you will be able to update your profile
and access the partner newsgroups.
================================================== ====
When responding to posts, please "Reply to Group" via your newsreader
so that others may learn and benefit from this issue.
================================================== ====
This posting is provided "AS IS" with no warranties, and confers no rights.
================================================== ====

Feb 23 '06 #7
Hi Mrinal,

Thanks for your understanding!

Regards,

Yuan Ren [MSFT]
Microsoft Online Support

Feb 25 '06 #8

This thread has been closed and replies have been disabled. Please start a new discussion.

Similar topics

8
by: gg | last post by:
I am confused regarding what the line in the following function does. It seems to work ok. It seems to be creating a new T object using the pointer to an existing T object. But which function is it...
8
by: Mike | last post by:
Hello, I have a few rather urgent questions that I hope someone can help with (I need to figure this out prior to a meeting tomorrow.) First, a bit of background: The company I work for is...
9
by: niclane | last post by:
Hi, I was reading section 5.5 of Ritchie and Kernighan and saw the following: " ..... char amessage = "now is the time"; char *pmessage = "now is the time";
4
by: Mike Moore | last post by:
We are developing an asp.net web application. When we drag and drop the sql connection object to the form we set the in the dynamic properties connection string to use the connection string in the...
35
by: Eric Sabine | last post by:
In my Finally block, I was using cn.close (where cn is an ADO.NET connection object, SQLConnection to be exact) and then I came across the following in some microsoft code. If Not cn Is Nothing...
6
by: Mikus Sleiners | last post by:
Is there any way to enable exception throws in VS 2005, that occur during binding operations? I am upset that i can't see exceptions that are thrown during binding operations. It's very hard to...
3
by: rkausch | last post by:
Hello, I'm performing some research to determine the feasibility of developing a Windows Service (see http://en.wikipedia.org/wiki/Windows_Service for the specific definition of "service" to which...
5
by: Philip Potter | last post by:
I have a somewhat flippant question regarding undefined behaviour. Does an operation which invokes undefined behaviour affect the whole program, or are earlier statements guaranteed to execute...
167
by: darren | last post by:
Hi I have to write a multi-threaded program. I decided to take an OO approach to it. I had the idea to wrap up all of the thread functions in a mix-in class called Threadable. Then when an...
1
by: CloudSolutions | last post by:
Introduction: For many beginners and individual users, requiring a credit card and email registration may pose a barrier when starting to use cloud servers. However, some cloud server providers now...
0
by: ryjfgjl | last post by:
In our work, we often need to import Excel data into databases (such as MySQL, SQL Server, Oracle) for data analysis and processing. Usually, we use database tools like Navicat or the Excel import...
0
by: Charles Arthur | last post by:
How do i turn on java script on a villaon, callus and itel keypad mobile phone
0
by: aa123db | last post by:
Variable and constants Use var or let for variables and const fror constants. Var foo ='bar'; Let foo ='bar';const baz ='bar'; Functions function $name$ ($parameters$) { } ...
0
by: ryjfgjl | last post by:
In our work, we often receive Excel tables with data in the same format. If we want to analyze these data, it can be difficult to analyze them because the data is spread across multiple Excel files...
0
by: emmanuelkatto | last post by:
Hi All, I am Emmanuel katto from Uganda. I want to ask what challenges you've faced while migrating a website to cloud. Please let me know. Thanks! Emmanuel
1
by: nemocccc | last post by:
hello, everyone, I want to develop a software for my android phone for daily needs, any suggestions?
1
by: Sonnysonu | last post by:
This is the data of csv file 1 2 3 1 2 3 1 2 3 1 2 3 2 3 2 3 3 the lengths should be different i have to store the data by column-wise with in the specific length. suppose the i have to...
0
by: Hystou | last post by:
There are some requirements for setting up RAID: 1. The motherboard and BIOS support RAID configuration. 2. The motherboard has 2 or more available SATA protocol SSD/HDD slots (including MSATA, M.2...

By using Bytes.com and it's services, you agree to our Privacy Policy and Terms of Use.

To disable or enable advertisements and analytics tracking please visit the manage ads & tracking page.