[转载]数据库缓存算法思想与实现
这个算法我花一整整一天才做出来,真的好欣慰,现在写一个简单的示例程序,看的懂就看,看不懂回家再练练。
当然了,真正的应用程序肯定没有这么简单,不过我写出来了也没有人能看得懂,因为包含我的N多个业务方法,我想一周之后,我自己都看不懂了,呵呵。
数据库缓存算法:
适用条件:
1,数据库记录访问极度频繁,但更新很少。
2,数据库记录很大,但所需数据却很少。
编程思想:
由两个线程来处理
线程1:每N小时扫描一次数据库,把符合条件的数据取出,放入缓存
线程2:实时扫描缓存对像,取出符合条件的记录处理。
实现程序代码:
public class PipedStreamDemo {
/**
* @author 黄越勇
* @create date 2007-6-27
*/
public static void main(String[] args) {
//主方法,不想多说了。
PipedOutputStream pos = new PipedOutputStream();
PipedInputStream pis = new PipedInputStream();
try {
pos.connect(pis);
new Producer(pos).start();
new Customer(pis).start();
} catch (IOException e) {
e.printStackTrace();
}
}
}
/******************************************************************************
* ****************************************************************************
* ******** 生产者线程,修改以下代码,把从数据库里取出来的数据以对象的形式存起来。
* ****************************************************************************
*/
class Producer extends Thread {
private PipedOutputStream pos;
public Producer(PipedOutputStream pos) {
this.pos = pos;
}
public synchronized void run() {
try {
/* 将对象写到一个文件里 这个很重要,相当于缓存*/
File f=new File("myvector.obj");
if(!f.exists())f.createNewFile();
FileOutputStream objfile = new FileOutputStream(f);
/* 创建一个输出流 */
ObjectOutputStream p = new ObjectOutputStream(objfile);
/* 创建一个TestVector对象 */
VectorList tv =new VectorList();
/*给Vector写入几String个对象*/
tv.add("One");
tv.add("Two");
tv.add("Three");
p.writeObject(tv); // 把tv写入流
p.flush();
objfile.close(); // 关闭文件对象
//pos.write("hello thank you for welcome!".getBytes());
pos.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
/******************************************************************************
* ****************************************************************************
* ********消费者, 把内容还原就可以用了 ********
* ****************************************************************************
*/
class Customer extends Thread {
private PipedInputStream pis;
public Customer(PipedInputStream pis) {
this.pis = pis;
}
public synchronized void run() {
try {
sleep(1000); //缓冲一下,很重要,管道流里没水的话,后果很严重
FileInputStream objfile = new FileInputStream("myvector.obj");
ObjectInputStream q = new ObjectInputStream(objfile);
/* 获取对象原始数据 */
VectorList myvector = (VectorList)q.readObject();
if(myvector.size()>0)myvector.print();
pis.close();
} catch (IOException e) {
e.printStackTrace();
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
/*******************************************************************************
* *****************************************************************************
* ******** 构造一个序列化的Vector对象以保存数据库数据 ********
* *****************************************************************************
*/
class VectorList implements Serializable{
private Vector vect=new Vector();
public void add(Object obj){
this.vect.add(obj);
}
public void print(){
System.out.println(this.vect);
}
public Object get(int index) {
return this.vect.get(index);
}
public int size(){
return vect.size();
}
}
出处:http://sirkevin.cnblogs.com
GitHub:https://github.com/backslash112
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
posted on 2012-04-17 15:33 backslash112 阅读(378) 评论(0) 编辑 收藏 举报
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 提示词工程——AI应用必不可少的技术
· Open-Sora 2.0 重磅开源!
· 周边上新:园子的第一款马克杯温暖上架