winform/mysql/长链接还是spool

 

winform/mysql/长链接还是spool

(原文链接 http://ddbiz.com/?p=176)

今日写一段代码,要经常不定时的插入数据到数据库,但是总是有一段时间,比如5个小时或者10个小时或者更长的时间是没有数据插入的。

而在一段长时间的无数据操作后,再次插入数据到此链接,会发生诸如: 此链接无法写入数据等的错误,原来的代码大致如下:

 

class DHelper

{

private static IDbConnection writeCnn = new MySqlConnection();

public DHelper(string cnn)

{

writeCnn.ConnectionString = cnn;

writeCnn.Open();

}

public void DoInsert()

{

if (writeCnn.State == ConnectionState.Closed) writeCnn.Open();

using(IDbCommand cmd = writeCnn.CreateCommand())

{

cmd.CommandText = "insert into temptable values ...";

IDbDataParameter p = cmd.CreateParameter();

...

using(IDbTransaction tx = writeCnn.BeginTransaction())

{

try{

cmd.ExecuteNonQuery();

tx.Commit();

}catch{

tx.Rollback();

}

}

}

...

}

}

有时候错误会发生在 begintransaction 或者 ExecuteNonQuery() 上。

 

可能某些原因造成了链接的中断:

1. 

2. 网络原因?

 

两种方法可以改进这个机制

1. 每次建立新链接,执行完毕后关闭链接

public void DoInsert()

{

using(IDbConnection writeCnn = new MySqlConnection(connectionStr))

{

using(IDbCommand cmd = writeCnn.CreateCommand())

{

cmd.CommandText = "insert into temptable values ...";

IDbDataParameter p = cmd.CreateParameter();

...

using(IDbTransaction tx = writeCnn.BeginTransaction())

{

try{

cmd.ExecuteNonQuery();

tx.Commit();

}catch{

tx.Rollback();

}

}

}

}

...

}

2. 每次执行前检查链接

public void DoInsert()

{

if (writeCnn.State == ConnectionStat.Closed) writeCnn.Open();

else if (writeCnn.State == ConnectionState.Broken){

writeCnn.Close(); writeCnn.Open();

}

using(IDbCommand cmd = writeCnn.CreateCommand())

{

cmd.CommandText = "insert into temptable values ...";

IDbDataParameter p = cmd.CreateParameter();

...

using(IDbTransaction tx = writeCnn.BeginTransaction())

{

try{

cmd.ExecuteNonQuery();

tx.Commit();

}catch{

tx.Rollback();

}

}

}

...

}

.net 应该对 connection spool 有发挥作用的,方式1应该和方式2在执行情况下没有太大的差别。那么实际的情况如何呢?下面的测试是在连续插入500条记录的情况下得出的统计数据,因为方式2的触发条件不存在(时间相对比较段/网络状况稳定),因此方式2的测试结果不能代表其实际的运行环境的状况。

<!--<! #t {margin:5px;padding:5px;}-->

-->

 插入次数

总用时

(ms)

最大用时
(ms)
最小用时
(ms)
平均用时
(ms)
超过60ms次数
方式150016140.625156.2515.62532.2812525
方式250015390.625187.515.62530.7812532

看来使用方式1基本上对一个频繁的写操作没有什么太大的影响。

方式2的实际环境测试,我在获得数据后再补入此处。

(原文链接 http://ddbiz.com/?p=176)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值