資料庫連接池問題

來源:互聯網
上載者:User

首先是我所作的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。如此這般便也可以算是一個串連池。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.