Problem with Pooling

Discussion of open issues, suggestions and bugs regarding ADO.NET provider for Oracle
Post Reply
amirela
Posts: 15
Joined: Tue 26 Oct 2010 10:51

Problem with Pooling

Post by amirela » Wed 14 Sep 2011 04:23

dotConnect Version: 6.30.202

Code: Select all


	class MyConnection: IDisposable
        {
            private OracleConnection Connection { get; set; }

            public MyConnection(string connectionString)
            {
                Connection = new OracleConnection(connectionString);
                Connection.Open();
            }

            public int ExecuteNonquery(string cmd)
            {
                var myCommand = new OracleCommand(cmd, Connection);
                return myCommand.ExecuteNonQuery();
            }

            public void Dispose()
            {
                Connection.Close();
            }
        }

        private void Start()
        {
            var cb = new OracleConnectionStringBuilder();
            cb.ConnectionTimeout = 30;
            cb.DefaultCommandTimeout = 30;
            cb.MaxPoolSize = 100;
            cb.Pooling = false;
            cb.UserId = "tst";
            cb.Password = "tst";
            cb.Server = "srv1";
            cb.ValidateConnection = true;

            var workedThread1 = new Thread(new ParameterizedThreadStart(DoWork1)) { IsBackground = true };
            workedThread1.Start(cb.ToString());

            var workedThread2 = new Thread(new ParameterizedThreadStart(DoWork2)) { IsBackground = true };
            workedThread2.Start(cb.ToString());

            Thread.Sleep(5000);
            workedThread1.Abort();
        }

        private void DoWork1(object connectionString)
        {
            try
            {
                Debug.WriteLine("Thread1 started");
                while (true)
                {
                    using (var connection = new MyConnection((string)connectionString))
                    {
// [b]ROW IS LOCKED IN OTHER PROGRAM[/b]
                        connection.ExecuteNonquery("UPDATE test SET name = '11111' where id = 1");
                    }
                    Debug.WriteLine("Update row");
                    Thread.Sleep(1000);
                }
            }catch(ThreadAbortException e)
            {
                Debug.WriteLine("ThreadAbortException: Thread 1");
            }
        }

        private void DoWork2(object connectionString)
        {
            Debug.WriteLine("Thread2 started");
            while (true)
            {
                using (var connection = new MyConnection((string)connectionString))
                {
                    connection.ExecuteNonquery("SELECT 1 FROM dual");
                }
                Debug.WriteLine("Test Query");
                Thread.Sleep(1000);
            }
        }
OUTPUT:

Thread1 started
Thread2 started

The thread '' (0x3038) has exited with code 0 (0x0).
The thread '' (0x2ea8) has exited with code 0 (0x0).
The thread '' (0x2eb0) has exited with code 0 (0x0).
Test Query
The thread '' (0x319c) has exited with code 0 (0x0).
The thread '' (0x3234) has exited with code 0 (0x0).
Test Query
The thread '' (0x2dcc) has exited with code 0 (0x0).
The thread '' (0x1e30) has exited with code 0 (0x0).
Test Query
The thread '' (0x1d68) has exited with code 0 (0x0).
The thread '' (0x1f94) has exited with code 0 (0x0).
Test Query
The thread '' (0x18d0) has exited with code 0 (0x0).
The thread '' (0x2864) has exited with code 0 (0x0).
Test Query
A first chance exception of type 'System.Threading.ThreadAbortException' occurred in Devart.Data.dll
The thread '' (0x33e8) has exited with code 0 (0x0).
The thread '' (0x332c) has exited with code 0 (0x0).
Test Query
The thread '' (0x1f40) has exited with code 0 (0x0).
The thread '' (0x2d5c) has exited with code 0 (0x0).
Test Query
The thread '' (0x3764) has exited with code 0 (0x0).
The thread '' (0x3d10) has exited with code 0 (0x0).
Test Query
The thread '' (0x2ebc) has exited with code 0 (0x0).
The thread '' (0x312c) has exited with code 0 (0x0).

... working, but ThreadAbortException havn't been catched


Now enable pooling:

Code: Select all

            var cb = new OracleConnectionStringBuilder();
            cb.ConnectionTimeout = 30;
            cb.DefaultCommandTimeout = 30;
            cb.MaxPoolSize = 100;
            cb.Pooling = true;
            cb.UserId = "tst";
            cb.Password = "tst";
            cb.Server = "srv1";
            cb.ValidateConnection = true;
OUTPUT:

Thread2 started
Thread1 started
The thread '' (0x43d0) has exited with code 0 (0x0).
The thread '' (0x6b0) has exited with code 0 (0x0).
The thread '' (0x43d8) has exited with code 0 (0x0).
Test Query
The thread '' (0x322c) has exited with code 0 (0x0).
Test Query
The thread '' (0x3ac0) has exited with code 0 (0x0).
Test Query
The thread '' (0x43c0) has exited with code 0 (0x0).
Test Query
The thread '' (0x412c) has exited with code 0 (0x0).
Test Query
A first chance exception of type 'System.Threading.ThreadAbortException' occurred in Devart.Data.dll
ThreadAbortException: Thread 1
A first chance exception of type 'System.Threading.ThreadAbortException' occurred in TestConnection.exe
The thread '' (0x1ee8) has exited with code 0 (0x0).
The thread '' (0x404c) has exited with code 0 (0x0).
Test Query

ThreadAbortException is caught, but thread2 is locked, why?

Shalex
Site Admin
Posts: 9543
Joined: Thu 14 Aug 2008 12:44

Post by Shalex » Mon 19 Sep 2011 15:52

We have reproduced the mentioned behaviour. We will investigate it and notify you about the results as soon as possible.

Shalex
Site Admin
Posts: 9543
Joined: Thu 14 Aug 2008 12:44

Post by Shalex » Thu 22 Sep 2011 15:16

This is a designed behaviour. Thread.Abort() cannot stop command execution in the first thread. Connection is placed in pool with executing command on it. And the second thread hangs when retrieves the same connection from the pool.

Post Reply