zoukankan      html  css  js  c++  java
  • 数据库连接池问题[转]

    首先是我所作的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连接能及时的反应信息。



    这里付上操作数据库的代码:
    说明: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。如此这般便也可以算是一个连接池。


    作者:水木    
     
  • 相关阅读:
    【React Native】某个页面禁用物理返回键
    【React Native】DeviceEventEmitter监听通知及带参数传值
    转载【React Native代码】手写验证码倒计时组件
    【React Native】 中设置 APP 名称、应用图标、为安卓添加启动图
    【React Native错误集】* What went wrong: Execution failed for task ':app:installDebug'.
    【React Native错误集】Import fails with "Failed to execute 'ImportScripts' on 'WorkerGlobalScope'"
    【React Native错误集】Android error “Could not get BatchedBridge, make sure your bundle is packaged properly” on start of app
    「React Native笔记」在React的 setState 中操作数组和对象的多种方法(合集)
    【React Native】Error: Attribute application@allowBackup value=(false) from AndroidManifest.xml
    坚果云如何使用二次验证码/谷歌身份验证器/两步验证/虚拟MFA?
  • 原文地址:https://www.cnblogs.com/hsapphire/p/1646330.html
Copyright © 2011-2022 走看看