EnterpriseLibrary+Oralce实现缓存失效并加载数据

本文主要介绍一个简单的解决方案。

主要用到了Caching Application Block+Data Access Application Block+Oracle

原理介绍:给表增加一个触发器,在修改数据时,调用Java存储过程修改一个外部txt文件,让缓存失效,然后重新加载数据。

增加一个测试表wf_sms,表结构如下:

Java存储过程代码:

create or replace and compile java source named say as
import java.io.*;
public class Hello
{
public static void say(String str)
{
try {
File aa
=new File("C:\\aaa.txt");
aa.delete();
aa.createNewFile();
FileWriter bb
=new FileWriter(aa);
bb.write(str);
bb.flush();
bb.close();
}
catch(IOException e)
{

}
}
}

增加一个函数调用用Java存储过程:

create or replace function hello(name varchar2) return varchar2
as language java name 'Hello.say(java.lang.String) return java.lang.String';

增加一个触发器:

CREATE OR REPLACE TRIGGER tr_wf_sms
BEFORE
INSERT OR DELETE OR UPDATE ON wf_sms
FOR EACH ROW

DECLARE
abc
VARCHAR(200);
BEGIN

SELECT hello(:NEW.Test2) INTO abc FROM dual;
--execute immediate hello(:NEW.Test2);
END;

数据库方面的准备工作做完了,现在新建一个c/s程序,界面如下

详细代码如下:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using Microsoft.Practices.EnterpriseLibrary.Caching;
using Microsoft.Practices.EnterpriseLibrary.Caching.Expirations;
using Microsoft.Practices.EnterpriseLibrary.Common;
using Microsoft.Practices.EnterpriseLibrary.Data;
using System.Data.Common;

namespace EnterpriseLibraryTest1
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}

ICacheManager cacheManager;
Database db
= DatabaseFactory.CreateDatabase();
DataTable _table;

/// <summary>
/// 加载缓存
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void button1_Click(object sender, EventArgs e)
{
FileDependency _fileDep
= new FileDependency("c:\\aaa.txt");
cacheManager.Add(_table.Rows[
0]["test1"].ToString(), _table.Rows[0]["test2"].ToString(), CacheItemPriority.Normal, null, _fileDep);//加入缓存
}

private void Form1_Load(object sender, EventArgs e)
{
cacheManager
= CacheFactory.GetCacheManager();//实例化ICachemanager
string sql = "select * from wf_sms";
DbCommand dc
= db.GetSqlStringCommand(sql);
_table
= db.ExecuteDataSet(dc).Tables[0];
}
/// <summary>
/// 获取缓存数据
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void button2_Click(object sender, EventArgs e)
{
if (cacheManager.GetData("aaa") == null)
{
FileDependency _fileDep1
= new FileDependency("c:\\aaa.txt");
cacheManager.Remove(
"aaa");
string sql = "select test2 from wf_sms where test1='aaa'";
DbCommand dc
= db.GetSqlStringCommand(sql);
string str = (string)db.ExecuteScalar(dc);
cacheManager.Add(
"aaa", str, CacheItemPriority.Normal, null, _fileDep1);
}
this.richTextBox1.Text = cacheManager.GetData("aaa").ToString();
}
/// <summary>
/// 修改数据
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void button3_Click(object sender, EventArgs e)
{
string sql = "update wf_sms set test2='" + Guid.NewGuid().ToString() + "' where test1='aaa'";
db.ExecuteNonQuery(CommandType.Text, sql);
}
}
}
posted @ 2011-07-15 09:45  金江  阅读(350)  评论(0编辑  收藏  举报