posts - 6,  comments - 25,  trackbacks - 1

首先是我所作的B/S软件需要多种数据库的支持,其中就包括Access数据库。而为了达到快的速度,必须把access的连接放入数据库连接池,所以我专门给access做了个数据库连接池。

问题出现了:“就是用access连接池的时候,有的时候会出现修改过的数据不能及时的反应到界面上来。”

刚开始我以为是我的access连接池写的有问题,于是是大找特找就是找不到原因,后来我干脆不用池,直接自己new一个全局连接放在静态变量里看一下会不会有问题,结果显示完全没有问题。

接着我又new 了两个连接放在静态变量里  conn1 和  conn2   ,  然后让conn1做了一个update数据操作,conn2又立马获取update的值,结果显示 获取的数据还是update前的数据,  然后过3到5秒 再让conn2去获取update的值 才能看到已经修改了。

于是我得出这样的结论,access数据库的多个连接情况下,其中某一个连接进行了修改操作需要过3到4秒才能反映到其他连接里来

如果这个结论被确定那就是说 access无法实现 传统上的 数据库连接池。

于是我想会不会是我的数据库操作代码有问题,于是我干脆用两台电脑做测试,分别在两台电脑上用office打开同一个access数据库,然后在其中一台上修改了某个数据,另外一台上立马打开改数据,结果显示 数据还是没有更新。  靠。从目前来看我上面的结论是符合实际的。

如果真的这个结论被坐实的话,就像我上面说的,“access无法实现 传统上的 数据库连接池”。那麻烦就大了,因为其他数据库连接池,如:sqlserver,是可以用的,而access不能用,那么可能需要更多的代码区分开来编写。

于是我又想,会不会是使用access连接的时候有没有什么特殊的属性(或者说方式),才能保证多个access连接能及时的反应信息。

哪位达人看到这个问题,如果能解决的给小子回复一下。

qq:54825898
email:chaxcha@gmail.com

这里付上操作数据库的代码:
说明:test.mdb中一个表,test 表,中间有两个自段id  和 num  都是数字。记录就一条 id=1  num=1
protected void LinkButton11_Click(object sender, EventArgs e)
    {
        String connStr = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + Server.MapPath("/test.mdb") + ";Persist Security Info=True;";
        String selectSql = "select [num] from  [test] where [id]=1";
        String updateSql = "Update [test] set [num]=[num]+1 where [id]=1";


        OleDbConnection connForUpdate = new OleDbConnection(connStr);
        OleDbConnection connForSelect = new OleDbConnection(connStr);
       
        OleDbCommand cmd;
        Object resultValue;

        try
        {
            connForUpdate.Open();
            connForSelect.Open();

            //修改前提取
            cmd = new OleDbCommand(selectSql, connForSelect);
            resultValue = cmd.ExecuteScalar();
            Response.Write("修改前:" + resultValue);
            Response.Write("<br/>");

            resultValue = null;

            //执行修改
            cmd = new OleDbCommand(updateSql, connForUpdate);
            cmd.ExecuteNonQuery();

            //修改后提取
            cmd = new OleDbCommand(selectSql, connForSelect);
            resultValue = cmd.ExecuteScalar();
            Response.Write("修改后:" + resultValue);

        }
        finally
        {
            connForSelect.Close();
            connForUpdate.Close();
        }
    }

此代码的结果是:
修改前:6
修改后:6

最终结论是,Access确实不能很好的实现连接池。 没法子,只能是变相的解决问题了。
我这里给出Access操作的几个可以提高速度方法:
1.让某些只是提取操作的单步业务使用同一个链接, 该连接因为都是单步提取数据,所以“不是即时性”的数据问题不大,如:获取点击数、查询等等都使用同一个连接,此conn保持状态不要关闭。
2.如果是非单步的业务就要使用完了连接及时关闭,不然会出现看不到刚刚更新过的数据,如:新增一条记录,新增完后要显示此记录的结果,由于是两张页面所以保证第一张页面的conn关闭了,第二张页面new出来,就没有问题。
3.这里可以思考这样的连接池,在conn返回到连接池的时候会把conn和session绑定起来,在需要获取一个连接的时候,先要判断所有和session绑定的conn,绑定时间在5秒前的就取消绑定,并把连接放回到freelist列表里,然后是根据传进来sessionID,如果在和session绑定的conn集合中能够找到相同的id那么就再次使用这个conn。如此这般便也可以算是一个连接池。

posted on 2007-04-07 16:07 狂图 阅读(3634) 评论(16)  编辑 收藏 所属分类: 数据库

FeedBack:
2007-04-08 09:30 | 戏水 [未注册用户]
也遇到过类似问题,access了解不多, 同求达人指点.
  回复  引用    
2007-04-08 10:59 | Jason Cui      
把整个数据库缓存到内存里进行操作,然后定时更新到硬盘上。
  回复  引用  查看    
2007-04-08 12:12 | THIN      
用SQLExpress 2005

  回复  引用  查看    
2007-04-08 17:38 | 编写人生      
OleDbConnection 支持连接池功能的,在连接中使用 OLE DB Services=-1 (EnableAll = -1),在高压力测试下,性能提高100倍左右。
  回复  引用  查看    
2007-04-08 19:52 | jentrees [未注册用户]
上微软网站去问问看了,估计是access本身的问题,它的同步机制而导致
  回复  引用    
2007-04-09 07:33 |       
使用静态类的连接,保证和Access间只能有一个连接;另外,尽是不要使用参数查询,很多使用SQL 2005的思想在Access是行不通的。所以,在做可行性分析时,一定能对一些较特殊的设计思路进行编码验证。
  回复  引用  查看    
#7楼 [楼主]
2007-04-09 09:02 | 朴攸      
@悟
你的方法就是 多个人都使用同一个连接。 这样虽然能够即时反应,但是Access的Conn在有事务的情况下是不允许其他操作的,如A这个人正在事务操作,B这个人要读取某些信息,那么就会报错。

“另外,尽是不要使用参数查询”这句话何解? 我用的都是参数查询没什么问题发生。
  回复  引用  查看    
2007-04-15 13:46 | 臭石头      
经过测试,我这里不存在更新延迟的情况。两个连接,第一个更新,第二个马上取,数据改变了。

我用的就是我上次给你的那个AC连接池。

AC最大支持255个连接。

我用单表14W数据进行测试,取一页时间为2秒多。
  回复  引用  查看    
#9楼 [楼主]
2007-04-17 09:34 | 狂图      
连接池。 你用的是上次的连接池。 那你小心了。 你是没有碰到出问题的情况而已, 一旦你出现我上面的状况 就会出问题。
  回复  引用  查看    
#10楼 [楼主]
2007-04-17 09:35 | 狂图      
如果你的连接池里只有一个连接当然是没有问题。 如果连接池里有两个连接, 然后第一个操作用第一个连接 紧接着 第二个操作用第二个连接 那么第二操作是读取不到第一个连接做的修改
  回复  引用  查看    
2007-04-17 09:46 | 臭石头      
呵呵,我是用了两个不同的连接字符串来连接两个数据库,前一个更新,后一个读取。我也通过调试确定,连接池里面有两个池(池是根据连接字符串产生的),分别供两个操作使用,结果就是,马上更新^_^

我让别人帮我测试,也不存在你所说的问题。
  回复  引用  查看    
#12楼 [楼主]
2007-04-17 15:06 | 狂图      
额。 == 你说的是用我上面的代码测试的吗。。。??

能不能看看你的测试代码?

至少我上面的代码出现了这样的症状。
  回复  引用  查看    
2007-07-16 21:34 | 孤剑 [未注册用户]
我看了你所描述的问题,我也遇到过。但是的注意,如果执行更新时,想立即获得数据更新,则必须保证读取数据的连接和进行update 的连接是同一个连接,如果你创建了两个连接,则这两个连接有一定的“时差”,不过你可以使用异步等操作更新连接。
比如:
Update()
{
if (null != conn2)
{
conn1= conn2;
}

conn1.update(...);
}
  回复  引用    
2008-01-21 17:09 | dde [未注册用户]
建议看看这篇文章,对您可能会有帮助 http://www.150it.cn/bianchengwendang/VB/854490793199.html
  回复  引用    
2008-08-25 10:13 | nani [未注册用户]
insert/update/delete之后,commit一下,就是在代码里面显式的写commit

比如
...(I/U/D操作)
command.Text = "commit";
command.ExcuteNoQuery();
  回复  引用    
2008-10-09 20:07 | supersun [未注册用户]
这个问题以前遇到过,是Access数据库本身的问题。
当时也很无奈,用了一个很无奈的方法:
在第二个conn执行前加延迟:
System.Threading.Thread.Sleep(2000);

要么就把这段程序做成一个conn。
  回复  引用    

标题  
姓名  
主页
Email (博主才能看到) 
验证码 *  看不清,换一张 [登录][注册]
内容(请不要发表任何与政治相关的内容)  
  登录  使用高级评论  新用户注册  返回页首  恢复上次提交      
该文被作者在 2008-01-26 11:41 编辑过


相关链接:
 



<2007年4月>
25262728293031
1234567
891011121314
15161718192021
22232425262728
293012345

与我联系

搜索

 

常用链接

留言簿

我的标签

随笔分类

随笔档案

新闻分类

最新评论

  • 1. re: 【原创】数据库连接池问题
  • 这个问题以前遇到过,是Access数据库本身的问题。 当时也很无奈,用了一个很无奈的方法: 在第二个conn执行前加延迟: System.Threading.Thread.Sleep(2000); ...
  • --supersun
  • 2. re: 【原创】数据库连接池问题
  • insert/update/delete之后,commit一下,就是在代码里面显式的写commit 比如 ...(I/U/D操作) command.Text = "commit"...
  • --nani

阅读排行榜

评论排行榜