db4o 7.4 for .net3.5试用手记
db4o虽然出来很久了,一直没怎么关注,今天随手试了下,对于小型应用还是不错的,至少省去了ORM的麻烦,一切皆对象,一切都变得那么自然。
下载地址:http://www.db4o.com/DownloadNow.aspx
优点: 1.使用简单,整个引擎只要一个dll(Db4objects.Db4o.dll)即能搞定(个人觉得可完全取代access用于某些小型应用)
2.数据库仅一个文件,方便部署 3.支持事务(文档上有提到的,不过我没测试过) 4.性能还过得去(10w以内的数据还可以接受,详见我的测试结果) 5.彻底忘记ORM吧,一切皆Object,还要什么ORM? 6.可同时用于.net与java平台
下面是测试代码:
db4o测试 by 菩提树下的杨过
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Diagnostics;
using Db4objects.Db4o;
namespace GetStarted
{
class Program
{
static string DBFileName = "D:\MyDoc\db4o\data\demo.yap";
static void Main(string[] args)
{
//如果文件已经存在,先删除(免得原来的记录影响测试结果)
if (File.Exists(DBFileName)) { try { File.Delete(DBFileName); } catch (Exception e) { Console.WriteLine(e.Message.ToString()); } }
IObjectContainer db = Db4oFactory.OpenFile(DBFileName);//打开数据库(如果数据库文件不存在,将自动创建)
try
{
Pilot pilot1 = new Pilot("Michael Schumacher", 100);
db.Store(pilot1);//对象存入数据库(即传统意义上的insert操作)
Console.WriteLine("Stored {0}", pilot1);
Pilot pilot2 = new Pilot("Rubens Barrichello", 99);
db.Store(pilot2);//再存一个对象
Console.WriteLine("Stored {0}", pilot2);
Console.WriteLine("-----------------------------------------");
Pilot proto = new Pilot(null, 0);//如果要查询出所有Pilot,创建一个"empty"的Pilot即可
IObjectSet result = db.QueryByExample(proto);
ListResult(result);
Console.WriteLine("-----------------------------------------");
Pilot proto1 = new Pilot("Rubens Barrichello", 0);//按Name查询(比如有意思的是:第二个参数随便什么都行,另外第一个参数是区分大小写的)
IObjectSet result1 = db.QueryByExample(proto1);
ListResult(result1);
Console.WriteLine("-----------------------------------------");
Pilot proto2 = new Pilot(null, 99);//按points查询
IObjectSet result2 = db.QueryByExample(proto2);
ListResult(result2);
Console.WriteLine("-----------------------------------------");
IList<Pilot> pilots = db.Query<Pilot>(typeof(Pilot));//泛型的查询方法,貌似写法更简单自然
foreach (Pilot p in pilots)
{
Console.WriteLine(p);
}
Console.WriteLine("-----------------------------------------");
IList<Pilot> pilots2 = db.Query<Pilot>(new Predicate<Pilot>(c => c.Name == "Rubens Barrichello"));//按Name查询
foreach (Pilot p in pilots2)
{
Console.WriteLine(p);
}
Console.WriteLine("-----------------------------------------");
//更新数据
Pilot pilot3 = pilots2.FirstOrDefault();
Console.WriteLine("before update:" + pilot3);
pilot3.AddPoints(10);
db.Store(pilot3);
var _p = db.Query<Pilot>(new Predicate<Pilot>(c => c.Name == pilot3.Name)).FirstOrDefault();
Console.WriteLine("after update:" + _p);
Console.WriteLine("-----------------------------------------");
//删除数据
db.Delete(_p);
IList<Pilot> listAfterDel = db.Query<Pilot>(typeof(Pilot));//显示删除后的所有对象
foreach (Pilot p in listAfterDel)
{
Console.WriteLine(p);
}
Console.WriteLine("-----------------------------------------");
//大量数据插入测试
Stopwatch stopMatch = new Stopwatch();
stopMatch.Start();
int Count = 100000;//10w条数据
for (int i = 0; i < Count; i++)
{
Pilot pInsert = new Pilot(i.ToString(),i);
db.Store(pInsert);
}
stopMatch.Stop();
Console.WriteLine("{0}条记录插入共耗时{1}毫秒", Count, stopMatch.ElapsedMilliseconds);
stopMatch.Start();
IList<Pilot> lstAll = db.Query<Pilot>(typeof(Pilot));
stopMatch.Stop();
Console.WriteLine("{0}条记录查询共耗时{1}毫秒", Count, stopMatch.ElapsedMilliseconds);
stopMatch.Start();
foreach (Pilot p in lstAll)
{
p.AddPoints(1);
db.Store(p);
}
stopMatch.Stop();
Console.WriteLine("{0}条记录更新共耗时{1}毫秒", Count, stopMatch.ElapsedMilliseconds);
stopMatch.Start();
foreach (Pilot p in lstAll)
{
db.Delete(p);
}
stopMatch.Stop();
Console.WriteLine("{0}条记录删除共耗时{1}毫秒", Count, stopMatch.ElapsedMilliseconds);
}
catch (Exception e)
{
Console.WriteLine(e.Message.ToString());
}
finally
{
db.Close();
}
Console.ReadLine();
}
static void ListResult(IObjectSet result)
{
Console.WriteLine(result.Count);
foreach (object item in result)
{
Console.WriteLine(item);
}
}
}
public class Pilot
{
string _name;
int _points;
public Pilot(string name, int points)
{
_name = name;
_points = points;
}
public string Name { get { return _name; } }
public int Points { get { return _points; } }
public void AddPoints(int points)
{
_points += points;
}
public override string ToString()
{
return string.Format("{0}/{1}", _name, _points);
}
}
}
本机运行结果:
Stored Michael Schumacher/100
Stored Rubens Barrichello/99
-----------------------------------------
2
Michael Schumacher/100
Rubens Barrichello/99
-----------------------------------------
1
Rubens Barrichello/99
-----------------------------------------
1
Rubens Barrichello/99
-----------------------------------------
Michael Schumacher/100
Rubens Barrichello/99
-----------------------------------------
Rubens Barrichello/99
-----------------------------------------
before update:Rubens Barrichello/99
after update:Rubens Barrichello/109
-----------------------------------------
Michael Schumacher/100
-----------------------------------------
100000条记录插入共耗时6176毫秒
100000条记录查询共耗时6189毫秒
100000条记录更新共耗时15861毫秒
100000条记录删除共耗时23730毫秒
- 数据库静默安装总结(r3笔记第58天)
- 用TensorFlow实现文本分析模型,做个聊天机器人
- 深度学习:用tensorflow建立线性回归模型
- 用python基于2015-2016年的NBA常规赛及季后赛的统计数据分析
- 数值信息的机器级存储
- ABAP和Java里关于DEFAULT(默认)机制的一些语言特性
- Golang语言社区--golang 进度下载文件
- Golang语言社区--Go语言基础第七节函数调用等
- Hyperledger也能实现Token代币
- 经典Java面试题收集(二)
- 关于表联结方法(一)(r3笔记第57天)
- Go 语言读写 Excel 文档
- 关于索引的使用模式(r3笔记56天)
- 关于oracle中的半连接(r3笔记55天)
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- cmd里如何查看历史命令并执行
- akka-typed(10) - event-sourcing, CQRS实战
- 【每日一题】37. Sudoku Solver
- A quick introduction to innodb_ruby (2.对innodb_ruby的简单介绍)
- Webkit 内核初探
- 配置跨域后,框架帮我们做了什么?
- python应用(1):安装与使用
- TCP粘包和拆包
- 性能测试必备命令(1)- free
- 记一次有趣的挖矿病毒
- 性能测试必备知识(10)- Linux 是怎么管理内存的?
- Ng-Matero V10 正式发布!
- 30.Python装饰器
- 13-5 vi查找和替换
- 设计模式~适配器模式