嵌入式firebird+VS2015实例十一

示例ClearPoolTest

FBConnection.ClearPool 方法:清空与指定连接关联的连接池。

ClearPool 清除与 connection 关联的连接池。如果调用时与 connection 关联的附加连接正在使用,则对这些连接进行相应的标记,并且在对这些连接调用 Close 时,放弃这些连接而不是将其返回连接池。

连接池

连接池定义

连接池是创建和管理一个连接的缓冲池的技术,这些连接准备好被任何需要它们的线程使用。

连接池原理

连接池基本的思想是在系统初始化的时候,将数据库连接作为对象存储在内存中,当用户需要访问数据库时,并非建立一个新的连接,而是从连接池中取出一个已建立的空闲连接对象。使用完毕后,用户也并非将连接关闭,而是将连接放回连接池中,以供下一个请求访问使用。而连接的建立、断开都由连接池自身来管理。同时,还可以通过设置连接池的参数来控制连接池中的初始连接数、连接的上下限数以及每个连接的最大使用次数、最大空闲时间等等。也可以通过其自身的管理机制来监视数据库连接的数量、使用情况等。

连接池参数

最小连接数

是连接池一直保持的数据库连接,所以如果应用程序对数据库连接的使用量不大,将会有大量的数据库连接资源被浪费;

最大连接数

是连接池能申请的最大连接数,如果数据库连接请求超过此数,后面的数据库连接请求将被加入到等待队列中,这会影响之后的数据库操作。

最小连接数与最大连接数相差太大

那么最先的连接请求将会获利,之后超过最小连接数量的连接请求等价于建立一个新的数据库连接。不过,这些大于最小连接数的数据库连接在使用完不会马上被释放,它将被放到连接池中等待重复使用或是空闲超时后被释放。

实例

创建项目:ClearPoolTest

ERRCheckTest模板

代码说明

            cs.ConnectionLifeTime = 15;//返回一个连接池时,它的创建时间与当前时间相比,和连接破坏如果时间(以秒计)超过指定的值连接。

            cs.Pooling = true;//当真正从池中连接了,或者如果有必要,创建和添加到适当的池。

            cs.MinPoolSize = 0;//池中所允许的最小连接数。

            cs.MaxPoolSize = 50;//池中允许的最大连接数。

当创建连接时,超过了最小连接数0,小于等于50,所以建立一个新的数据库连接。当关闭连接时,这些大于最小连接数0的数据库连接在使用完不会马上被释放,它将被放到连接池中等待重复使用或是空闲超时(15秒)后被释放。

连接关闭后到连接被释放前,连接数是1,连接是空闲连接。如果超过15秒空闲连接没有被使用,将会释放,连接数回归为最小连接数0。

若最小连接数设置为1,没有创建连接前,连接数是0,一旦创建连接再关闭,连接数始终大于等于1,小于等于50,如果连接没有被重新使用,则连接一直是空闲连接。

如果想在15秒前释放连接,必须使用FBConnection.ClearPool 方法或者FbConnection.ClearAllPools方法。如:

                FbConnection.ClearPool(myConnection);

                //FbConnection.ClearAllPools();

只有当连接数等于0时,其它进程才能对这个数据库进行操作,否则只能通过连接来操作数据库。

完整代码

using System;

using System.Data;

using System.Windows.Forms;

using System.IO;

using FirebirdSql.Data.FirebirdClient;

 

namespace ClearPoolTest

{

    publicpartialclassFrmMain : Form

    {

        public FrmMain()

        {

            InitializeComponent();

        }

        publicFbConnection myConnection;

        staticstringGetConnectionString()// 连接字符串

        {

            FbConnectionStringBuilder cs = newFbConnectionStringBuilder();

            cs.UserID = "SYSDBA";

            cs.Password = "masterkey";

            cs.Database = Application.StartupPath + "\\data\\测试.fdb";

            cs.DataSource = "localhost";

            cs.Charset = "UTF8";

            cs.Port = 3050;

            cs.Dialect = 3;

            cs.Role = "";

            cs.ConnectionLifeTime = 15;//返回一个连接池时,它的创建时间与当前时间相比,和连接破坏如果时间(以秒计)超过指定的值连接。

            cs.Pooling = true;//当真正从池中连接了,或者如果有必要,创建和添加到适当的池。

            cs.MinPoolSize = 1;//池中所允许的最小连接数。

            cs.MaxPoolSize = 50;//池中允许的最大连接数。

 

            cs.PacketSize = 8192;

            cs.ServerType = FbServerType.Embedded;

            return cs.ToString();

        }

        privatevoidbtnCreateDB_Click(object sender, EventArgs e)

        {

            //创建数据库

            string path = Application.StartupPath + "\\data\\测试.fdb";

            try

            {

                if (File.Exists(path))

                {

                    File.Delete(path);

 

                    FbConnection.CreateDatabase(GetConnectionString());

                    MessageBox.Show("文件存在,删除重建!");

                }

                else

                {

                    FbConnection.CreateDatabase(GetConnectionString());

                    MessageBox.Show("文件不存在,直接创建!");

                }

            }

            catch (Exception ex)

            {

                MessageBox.Show(ex.Message);

            }

        }

        privatevoidbtnOpenDB_Click(object sender, EventArgs e)

        {

            //打开数据库

            myConnection = newFbConnection(GetConnectionString());

            try

            {

                myConnection.Open();

                MessageBox.Show("打开连接成功!");

            }

            catch (Exception ex)

            {

                MessageBox.Show(ex.Message);

            }

        }

        privatevoidbtnCreateTable_Click(object sender, EventArgs e)

        {

            //创建空表

            try

            {

                FbCommand createTable = myConnection.CreateCommand();

                createTable.CommandText = "create table TestTBL (id int,\"姓名\" varchar(20))";

                createTable.ExecuteNonQuery();

 

                createTable.Dispose();

                MessageBox.Show("创建空表成功!");

            }

            catch (Exception ex)

            {

                MessageBox.Show(ex.Message);

            }

        }

        privatevoidbtnBinddgView_Click(object sender, EventArgs e)

        {

            //DataGridView显示数据

            try

            {

                FbDataAdapter dt = newFbDataAdapter("select * from TestTBL", myConnection);

                DataSet ds = newDataSet();

                dt.Fill(ds, "TestTBL");

                this.dgViewDB.DataSource = ds;

                this.dgViewDB.DataMember = "TestTBL";

 

                dt.Dispose();

                ds.Dispose();

                MessageBox.Show("DataGridView显示数据!");

            }

            catch (Exception ex)

            {

                MessageBox.Show(ex.Message);

            }

        }

        privatevoidbtnInsertData_Click(object sender, EventArgs e)

        {

            //插入数据

            try

            {

                //插入数据一

                FbCommand insertData = myConnection.CreateCommand();

                insertData.CommandText = "insert into TestTBL values(@id, @name)";

                insertData.Parameters.Clear();

                insertData.Parameters.Add("@id", FbDbType.Integer).Value = 1;

                insertData.Parameters.Add("@name", FbDbType.VarChar, 20).Value = "张三";

                insertData.ExecuteNonQuery();

 

                //插入数据二

                insertData.CommandText = "insert into TestTBL values(@id, @胡作非为)";

                insertData.Parameters.Clear();

                insertData.Parameters.Add("@id", FbDbType.Integer).Value = 2;

                insertData.Parameters.Add("@胡作非为", FbDbType.VarChar, 20).Value = "李四";

                insertData.ExecuteNonQuery();

 

                insertData.Dispose();

                MessageBox.Show("插入数据成功!");

            }

            catch (Exception ex)

            {

                MessageBox.Show(ex.Message);

           }

        }

        privatevoidbtnReadData_Click(object sender, EventArgs e)

        {

            //读取数据

            try

            {

                FbCommand readData = myConnection.CreateCommand();

                readData.CommandText = "select * from TestTBL";

                FbDataReader Reader = readData.ExecuteReader();

                while (Reader.Read())

                {

                    string str_Temp = Reader.GetString(0);

                    MessageBox.Show(str_Temp);

                    str_Temp = Reader.GetString(1);

                    MessageBox.Show(str_Temp);

                }

 

                readData.Dispose();

                MessageBox.Show("读取数据成功!");

            }

            catch (Exception ex)

            {

                MessageBox.Show(ex.Message);

            }

        }

 

        privatevoidbtnConnectionClose_Click(object sender, EventArgs e)

        {

            //关闭连接

            try

            {

                myConnection.Close();

                //FbConnection.ClearPool(myConnection);

                //FbConnection.ClearAllPools();

                MessageBox.Show("连接已关闭,并释放!");

            }

            catch (Exception ex)

            {

                MessageBox.Show(ex.Message);

            }

        }

    }

}

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值