[NHibernate]基本配置与测试
目录
写在前面
一年前刚来这家公司,发现项目中使用的ORM是Nhibernate,这个之前确实没接触过,EF多少在项目中用过,想着既然都是ORM,应该语法上都差不多。当时也就是硬着头皮上的,刚开始也只能通过模仿别人的代码,再加上自己的理解,一些增删改查的方法,确实也被自己给搞出来了,现在回头想想,在项目中,用到的那些方法基本上就一个样,很少有变化。除非有些业务逻辑非常强的,自己搞不定,问一下同事,还是可以解决的。到现在使用Nhibernate也很长时间,中间多少也查过一些资料,从网上下的nhibernate文档.docx,但是每次想去找的时候,总的在电脑上去找,比较麻烦,就干脆记录在博客中了,当时就是有哪些不明白的,可以很方便的从里面查,比如参数是什么含义。也总结了一些,在使用过程遇到的问题。
现在项目告一段落,坐等为客户去部署了,也就有那么点空闲时间,那就要系统的学习一下了。
发现在写这篇文章的时候,说了自己的一些学习方式,发现越写越多,就单独成篇了,也就有了这篇文章——如何高效的利用博客园?
上篇文章,也算是nhibernate学习的开篇吧。
nhibernate文档
[NHibernate]持久化类(Persistent Classes)
[NHibernate]集合类(Collections)映射
[NHibernate]缓存(NHibernate.Caches)
[NHibernate]NHibernate.Tool.hbm2net
[NHibernate]Nhibernate如何映射sqlserver中image字段
搭建项目
项目结构和映射文件
项目结构说明
采用传统三层架构
Wolfy.Shop.Domain:数据实体和数据库映射文件。也有人叫做领域层。
Wolfy.Shop.Data:数据层,存放数据库的操作及Nhibernate辅助类。引用Iesi.Collections.dll,NHibernate.dll和类库Wolfy.Shop.Domain
Wolfy.Shop.Business:业务逻辑类。引用类库项目Wolfy.Shop.Domain,Wolfy.Shop.Data
Wolfy.Shop.WebSite:测试项目。需引用Iesi.Collections.dll,NHibernate.dll和类库项目Wolfy.Shop.Domain,Wolfy.Shop.Business
Nhibernate最新版本为4.0.1.GA,下载地址:http://nhforge.org/
解压NHibernate-4.0.1.GA-bin.zip压缩包,内容如下:
其中Confiuration_Templates文件夹内包括:
这些xml内为数据库连接配置文件模版,通过上图也可以发现nhibernate支持的数据库种类还是很全的。主流的数据库已经都包括在内了。
那么,咱们打开MSSQL.cfg的文件看一下
<?xml version="1.0" encoding="utf-8"?>
<!--
This template was written to work with NHibernate.Test.
Copy the template to your NHibernate.Test project folder and rename it in hibernate.cfg.xml and change it
for your own use before compile tests in VisualStudio.
-->
<!-- This is the System.Data.dll provider for SQL Server -->
<hibernate-configuration xmlns="urn:nhibernate-configuration-2.2" >
<session-factory name="NHibernate.Test">
<property name="connection.driver_class">NHibernate.Driver.SqlClientDriver</property>
<property name="connection.connection_string">
Server=(local);initial catalog=nhibernate;Integrated Security=SSPI
</property>
<property name="dialect">NHibernate.Dialect.MsSql2008Dialect</property>
</session-factory>
</hibernate-configuration>
通过上面的注释部分咱们可以得到一个信息,就是在项目中使用的话,需要将文件重命名为hibernate.cfg.xml.
添加引用
同样可以通过Nuget进行添加,如图:
持久化类
为客户实体创建持久化类
namespace Wolfy.Shop.Domain.Entities
{
/// <summary>
/// 描述:客户实体,数据库持久化类
/// 创建人:wolfy
/// 创建时间:2014-10-16
/// </summary>
public class Customer
{
/// <summary>
/// 客户id
/// </summary>
public virtual Guid CustomerID { get; set; }
/// <summary>
/// 客户名字
/// </summary>
public virtual string CustomerName { get; set; }
/// <summary>
/// 客户地址
/// </summary>
public virtual string CustomerAddress { get; set; }
}
}
注意NHibernate默认使用代理功能,要求持久化类不是sealed的,而且其公共方法、属性和事件声明为virtual。在这里,类中的字段要设置为virtual,否则出现“
“NHibernate.InvalidProxyTypeException”类型的异常在 Wolfy.Shop.Data.dll 中发生,但未在用户代码中进行处理
其他信息: The following types may not be used as proxies:
Wolfy.Shop.Domain.Entities.Customer: method get_CustomerID should be 'public/protected virtual' or 'protected internal virtual'
Wolfy.Shop.Domain.Entities.Customer: method set_CustomerID should be 'public/protected virtual' or 'protected internal virtual'
Wolfy.Shop.Domain.Entities.Customer: method get_CustomerName should be 'public/protected virtual' or 'protected internal virtual'
Wolfy.Shop.Domain.Entities.Customer: method set_CustomerName should be 'public/protected virtual' or 'protected internal virtual'
”异常。
编写映射文件
编写NHibernate配置文件智能提示的功能。只要在下载的NHibernate里找到configuration.xsd和nhibernate-mapping.xsd两个文件并复制到vs安装目录下,如C:\Program Files\Microsoft Visual Studio 9.0\Xml\Schemas目录即可。
此时,你在nhibernate的配置文件中就有智能提示功能了。
nhibernate如何知道持久化类和数据库表的对应关系的呢?这就要通过映射文件来完成这个任务了,映射文件包含了对象/关系映射所需的元数据。元数据包含持久化类的声明和属性到数据库的映射。映射文件告诉nhibernate它应该访问数据库里面的哪个表及使用表里面的哪些字段。
那么我们编写Customer持久化类的映射文件,注意映射文件以.hbm.xml结尾。如Customer.hbm.xml
<?xml version="1.0" encoding="utf-8" ?>
<!--assembly:程序集,namespace:命名空间-->
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" assembly="Wolfy.Shop.Domain" namespace="Wolfy.Shop.Domain.Entities">
<class name="Wolfy.Shop.Domain.Entities.Customer,Wolfy.Shop.Domain" table="TB_Customer">
<!--主键-->
<id name="CustomerID" type="Guid" unsaved-value="null">
<column name="CustomerID" sql-type="uniqueidentifier" not-null="true" unique="true"/>
<generator class="assigned"></generator>
</id>
<property name="CustomerName" type="String">
<column name="CustomerName" sql-type="nvarchar" not-null="false"/>
</property>
<property name="CustomerAddress" type="String">
<column name="CustomerAddress" sql-type="nvarchar" not-null="false"/>
</property> </class>
</hibernate-mapping>
这些东西该怎么记?记住根节点hibernate,并且映射文件中要有主键id和property节点就可以了,其他的依赖vs的智能提示,就可以了。
这里需要养成一个习惯,就写好映射文件,需要修改它的属性
否则会出现,如下错误,而这个错误也是使用nhibernate最常见,所以养成一个好习惯,能提高你的开发效率:
辅助类
在使用之前,需要通过ISessionFactory获得ISession,ISessionFactory的详细介绍可以参考文档[NHibernate]ISessionFactory配置 ,ISessionFactory是线程安全的,而ISession是非线程安全的。很多线程可以同时访问ISessionFactory,所以ISession要通过ISessionFactory打开,在所有的工作完成后,需要关闭。ISessionFactory通常是个线程安全的全局对象,只需要被实例化一次(可以使用单例模式)。这里编写一个简单的辅助类NHibernateHelper,用于创建ISessionFactory和配置ISessionFactory,并打开一个新的ISession的方法。代码如下:
using NHibernate;
using NHibernate.Cfg;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks; namespace Wolfy.Shop.Data
{
/// <summary>
/// 描述:nhibernate辅助类
/// 创建人:wolfy
/// 创建时间:2014-10-16
/// </summary>
public class NHibernateHelper
{
private ISessionFactory _sessionFactory;
public NHibernateHelper()
{
//创建ISessionFactory
_sessionFactory = GetSessionFactory();
}
/// <summary>
/// 创建ISessionFactory
/// </summary>
/// <returns></returns>
public ISessionFactory GetSessionFactory()
{
//配置ISessionFactory
return (new Configuration()).Configure().BuildSessionFactory();
}
/// <summary>
/// 打开ISession
/// </summary>
/// <returns></returns>
public ISession GetSession()
{
return _sessionFactory.OpenSession();
}
} }
这里需引入命名空间:NHibernate和NHibernate.Cfg。
数据库设计与连接配置
数据表设计如图所示:
创建数据表的sql
USE [master]
GO
/****** Object: Database [Shop] Script Date: 2014/11/2 11:28:05 ******/
CREATE DATABASE [Shop]
CONTAINMENT = NONE
ON PRIMARY
( NAME = N'Shop', FILENAME = N'F:\Database\Shop.mdf' , SIZE = 5120KB , MAXSIZE = UNLIMITED, FILEGROWTH = 1024KB )
LOG ON
( NAME = N'Shop_log', FILENAME = N'F:\Database\Shop_log.ldf' , SIZE = 1024KB , MAXSIZE = 2048GB , FILEGROWTH = 10%)
GO
ALTER DATABASE [Shop] SET COMPATIBILITY_LEVEL = 110
GO
IF (1 = FULLTEXTSERVICEPROPERTY('IsFullTextInstalled'))
begin
EXEC [Shop].[dbo].[sp_fulltext_database] @action = 'enable'
end
GO
ALTER DATABASE [Shop] SET ANSI_NULL_DEFAULT OFF
GO
ALTER DATABASE [Shop] SET ANSI_NULLS OFF
GO
ALTER DATABASE [Shop] SET ANSI_PADDING OFF
GO
ALTER DATABASE [Shop] SET ANSI_WARNINGS OFF
GO
ALTER DATABASE [Shop] SET ARITHABORT OFF
GO
ALTER DATABASE [Shop] SET AUTO_CLOSE OFF
GO
ALTER DATABASE [Shop] SET AUTO_CREATE_STATISTICS ON
GO
ALTER DATABASE [Shop] SET AUTO_SHRINK OFF
GO
ALTER DATABASE [Shop] SET AUTO_UPDATE_STATISTICS ON
GO
ALTER DATABASE [Shop] SET CURSOR_CLOSE_ON_COMMIT OFF
GO
ALTER DATABASE [Shop] SET CURSOR_DEFAULT GLOBAL
GO
ALTER DATABASE [Shop] SET CONCAT_NULL_YIELDS_NULL OFF
GO
ALTER DATABASE [Shop] SET NUMERIC_ROUNDABORT OFF
GO
ALTER DATABASE [Shop] SET QUOTED_IDENTIFIER OFF
GO
ALTER DATABASE [Shop] SET RECURSIVE_TRIGGERS OFF
GO
ALTER DATABASE [Shop] SET DISABLE_BROKER
GO
ALTER DATABASE [Shop] SET AUTO_UPDATE_STATISTICS_ASYNC OFF
GO
ALTER DATABASE [Shop] SET DATE_CORRELATION_OPTIMIZATION OFF
GO
ALTER DATABASE [Shop] SET TRUSTWORTHY OFF
GO
ALTER DATABASE [Shop] SET ALLOW_SNAPSHOT_ISOLATION OFF
GO
ALTER DATABASE [Shop] SET PARAMETERIZATION SIMPLE
GO
ALTER DATABASE [Shop] SET READ_COMMITTED_SNAPSHOT OFF
GO
ALTER DATABASE [Shop] SET HONOR_BROKER_PRIORITY OFF
GO
ALTER DATABASE [Shop] SET RECOVERY FULL
GO
ALTER DATABASE [Shop] SET MULTI_USER
GO
ALTER DATABASE [Shop] SET PAGE_VERIFY CHECKSUM
GO
ALTER DATABASE [Shop] SET DB_CHAINING OFF
GO
ALTER DATABASE [Shop] SET FILESTREAM( NON_TRANSACTED_ACCESS = OFF )
GO
ALTER DATABASE [Shop] SET TARGET_RECOVERY_TIME = 0 SECONDS
GO
USE [Shop]
GO
/****** Object: Table [dbo].[TB_Customer] Script Date: 2014/11/2 11:28:05 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [dbo].[TB_Customer](
[CustomerID] [uniqueidentifier] NOT NULL,
[CustomerName] [nvarchar](16) NULL,
[CustomerAddress] [nvarchar](128) NULL,
[Version] [int] NOT NULL,
CONSTRAINT [pk_customerid] PRIMARY KEY CLUSTERED
(
[CustomerID] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY] GO
/****** Object: Table [dbo].[TB_Order] Script Date: 2014/11/2 11:28:06 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [dbo].[TB_Order](
[OrderID] [uniqueidentifier] NOT NULL,
[CustomerID] [uniqueidentifier] NULL,
[OrderDate] [datetime] NULL,
CONSTRAINT [PK_TB_Order] PRIMARY KEY CLUSTERED
(
[OrderID] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY] GO
/****** Object: Table [dbo].[TB_OrderProduct] Script Date: 2014/11/2 11:28:06 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [dbo].[TB_OrderProduct](
[OrderID] [uniqueidentifier] NOT NULL,
[ProductID] [uniqueidentifier] NOT NULL
) ON [PRIMARY] GO
/****** Object: Table [dbo].[TB_Product] Script Date: 2014/11/2 11:28:06 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [dbo].[TB_Product](
[ProductID] [uniqueidentifier] NOT NULL,
[Name] [nvarchar](128) NULL,
[Price] [decimal](18, 0) NULL,
CONSTRAINT [PK_TB_Product] PRIMARY KEY CLUSTERED
(
[ProductID] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY] GO
ALTER TABLE [dbo].[TB_Customer] ADD DEFAULT ((1)) FOR [Version]
GO
ALTER TABLE [dbo].[TB_Order] WITH CHECK ADD CONSTRAINT [FK_TB_Order_TB_Customer] FOREIGN KEY([CustomerID])
REFERENCES [dbo].[TB_Customer] ([CustomerID])
GO
ALTER TABLE [dbo].[TB_Order] CHECK CONSTRAINT [FK_TB_Order_TB_Customer]
GO
ALTER TABLE [dbo].[TB_OrderProduct] WITH CHECK ADD CONSTRAINT [FK_TB_OrderProduct_TB_Order] FOREIGN KEY([OrderID])
REFERENCES [dbo].[TB_Order] ([OrderID])
GO
ALTER TABLE [dbo].[TB_OrderProduct] CHECK CONSTRAINT [FK_TB_OrderProduct_TB_Order]
GO
ALTER TABLE [dbo].[TB_OrderProduct] WITH CHECK ADD CONSTRAINT [FK_TB_OrderProduct_TB_Product] FOREIGN KEY([ProductID])
REFERENCES [dbo].[TB_Product] ([ProductID])
GO
ALTER TABLE [dbo].[TB_OrderProduct] CHECK CONSTRAINT [FK_TB_OrderProduct_TB_Product]
GO
USE [master]
GO
ALTER DATABASE [Shop] SET READ_WRITE
GO
nhibernate配置,也就是数据库配置:
这里使用的是SQL Server2012,所以我们使用MSSQL.cfg.xml文件,重命名为hibernate.cfg.xml.
注意需根据自己数据库的实例名修改,并添加mapping节点,其他的设置,可根据需要进行添加。这里采用最简单的一种方式,关于nhibernate的配置参数,可参考文档中的说明。
1 <?xml version="1.0" encoding="utf-8" ?>
2 <hibernate-configuration xmlns="urn:nhibernate-configuration-2.2" >
3 <session-factory>
4 <property name="connection.driver_class">NHibernate.Driver.SqlClientDriver</property>
5 <property name="connection.connection_string">
6 server=.;database=shop;uid=sa;pwd=sa
7 </property>
8 <property name="dialect">NHibernate.Dialect.MsSql2008Dialect</property>
9 <mapping assembly="Wolfy.Shop.Domain"/>
10 </session-factory>
11 </hibernate-configuration>
修改后,将hibernate.cfg.xml拷入Wolfy.Shop.WebSite项目,并修改其属性:
否则会出现如下异常:
数据层和业务逻辑层代码
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Wolfy.Shop.Domain.Entities;
using NHibernate;
using NHibernate.Linq;
using NHibernate.Cfg;
using System.Linq.Expressions;
namespace Wolfy.Shop.Data
{
/// <summary>
/// 描述:客户数据层类,操作数据库
/// 创建人:wolfy
/// 创建时间:2014-10-16
/// </summary>
public class CustomerData
{
/// <summary>
/// 添加客户
/// </summary>
/// <param name="customer">客户实体</param>
/// <returns>是否添加成功 </returns>
public bool AddCustomer(Customer customer)
{ try
{
NHibernateHelper nhibernateHelper = new NHibernateHelper();
var session = nhibernateHelper.GetSession();
session.SaveOrUpdate(customer);
session.Flush();
return true;
}
catch (Exception ex)
{
throw ex;
}
}
/// <summary>
/// 根据条件得到客户信息集合
/// </summary>
/// <param name="where">条件</param>
/// <returns>客户信息集合</returns>
public IList<Customer> GetCustomerList(Expression<Func<Customer, bool>> where)
{
try
{
NHibernateHelper nhibernateHelper = new NHibernateHelper();
ISession session = nhibernateHelper.GetSession();
return session.Query<Customer>().Where(where).ToList();
}
catch (Exception ex)
{
throw ex;
}
}
}
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Linq.Expressions;
using System.Text;
using System.Threading.Tasks;
using Wolfy.Shop.Data;
using Wolfy.Shop.Domain.Entities; namespace Wolfy.Shop.Business
{ /// <summary>
/// 描述:客户信息业务逻辑层
/// 创建人:wolfy
/// 创建时间:2014-10-17
/// </summary>
public class CustomerBusiness
{
private CustomerData _customerData;
public CustomerBusiness()
{
_customerData = new CustomerData();
}
/// <summary>
/// 添加客户
/// </summary>
/// <param name="customer">客户实体</param>
/// <returns>是否添加成功 </returns>
public bool AddCustomer(Customer customer)
{
return _customerData.AddCustomer(customer);
}
/// <summary>
/// 根据条件得到客户信息集合
/// </summary>
/// <param name="where">条件</param>
/// <returns>客户信息集合</returns>
public IList<Customer> GetCustomerList(Expression<Func<Customer, bool>> where)
{
return _customerData.GetCustomerList(where);
}
}
}
测试
为了以后使用方便,在这里使用webform项目作为测试,通过单击“添加”按钮,向数据库中插入记录,
页面
<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="CustomerManager.aspx.cs" Inherits="Wolfy.Shop.WebSite.CustomerManager" %> <!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title></title>
<style type="text/css">
.main {
border: 1px solid #0094ff;
margin: 50px auto;
width: 600px;
} .table {
border: 1px solid #0094ff;
border-collapse: collapse;
width: 98%;
text-align: center;
margin:5px auto;
} .table th {
background-color: lightgray;
}
.table tr td {
border: 1px solid #0094ff;
}
</style>
</head>
<body>
<form id="form1" runat="server">
<div class="main">
<asp:Button runat="server" ID="btnAdd" Text="添加" OnClick="btnAdd_Click" />
<div>
<asp:Repeater runat="server" ID="rptCustomerList">
<HeaderTemplate>
<table class="table">
<tr>
<th>姓名</th>
<th>姓名</th>
<th>地址</th>
</tr>
</HeaderTemplate>
<ItemTemplate>
<tr>
<td><%#Container.ItemIndex+1 %></td>
<td><%#Eval("CustomerName") %></td>
<td><%#Eval("CustomerAddress") %></td>
</tr>
</ItemTemplate>
<FooterTemplate>
</table>
</FooterTemplate>
</asp:Repeater>
</div>
</div>
</form>
</body>
</html>
CustomerManager。aspx
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using Wolfy.Shop.Domain.Entities; namespace Wolfy.Shop.WebSite
{
public partial class CustomerManager : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
{
RepeaterDataBind();
}
}
private void RepeaterDataBind()
{
Business.CustomerBusiness customerBusiness = new Business.CustomerBusiness();
this.rptCustomerList.DataSource = customerBusiness.GetCustomerList(c => == );
this.rptCustomerList.DataBind();
}
/// <summary>
/// 添加客户信息
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
protected void btnAdd_Click(object sender, EventArgs e)
{
var customer = new Customer() { CustomerName = "wolfy", CustomerAddress = "北京 海淀", CustomerID = Guid.NewGuid() };
Business.CustomerBusiness customerBusiness = new Business.CustomerBusiness();
if (customerBusiness.AddCustomer(customer))
{
this.RepeaterDataBind();
}
}
}
}
CustomerManager.aspx.cs
界面
通过SQL Server Profiler查看生成的sql语句
通过监控到的sql语句,也可以看到使用nhibernate插入数据时,数据库中是通过存储过程进行插入数据的。
总结
本文简单介绍了使用nhibernate的一些配置,给我的感觉是,在使用时只要配置正确,其他的增删改查什么的也就没什么难的了。在配置nhibernate的时候,有些细节需要注意。比如映射文件和nhibernate的配置文件的属性需要进行修改。
参考文章
http://www.cnblogs.com/lyj/archive/2008/10/14/1310913.html#comment_tip
[NHibernate]基本配置与测试的更多相关文章
- 一步步学习NHibernate(2)——配置NHibernate的环境
请注明转载地址:http://www.cnblogs.com/arhat 第二章 环境搭建 在上一章中,我们知道了NHibernate是用来干什么的了,那么今天在本章中,我们开始搭建NHibernat ...
- 四步完成NodeJS安装,配置和测试
四步完成NodeJS安装,配置和测试 NodeJS 官网地址: http://nodejs.org/ 第一步:在官网点击 ’ INSTALL ’,下载相应的版本(我的机器是Win7专业版 64bit) ...
- WIN7环境下CUDA7.5的安装、配置和测试(Visual Studio 2010)
以下基于"WIN7(64位)+Visual Studio 2010+CUDA7.5". 系统:WIN7,64位 开发平台:Visual Studio 2010 显卡:NVIDIA ...
- NHibernate 基本配置 (第一篇)
使用NHibernate最重要的一步就是配置,如果连NHibernate都还没有跑的起来,谈何学习.今天就来详解一下NHibernate的配置. 一.NHibernate基本配置 NHibernate ...
- freeRadius 基础配置及测试
国内私募机构九鼎控股打造APP,来就送 20元现金领取地址:http://jdb.jiudingcapital.com/phone.html 内部邀请码:C8E245J (不写邀请码,没有现金送) 国 ...
- myBatis 基础测试 表关联关系配置 集合 测试
myBatis 基础测试 表关联关系配置 集合 测试 测试myelipse项目源码 sql 下载 http://download.csdn.net/detail/liangrui1988/599388 ...
- ubuntu10.10 tftp安装,配置,测试
ubuntu10.10 tftp安装,配置,测试 成于坚持,败于止步 虽然ubuntu/centos/redhat都是linux,但是内核其中存在一定的修改,所以对于tftp服务器的安装存在不同的命令 ...
- 大数据测试之hadoop集群配置和测试
大数据测试之hadoop集群配置和测试 一.准备(所有节点都需要做):系统:Ubuntu12.04java版本:JDK1.7SSH(ubuntu自带)三台在同一ip段的机器,设置为静态IP机器分配 ...
- Oracle RAC 11g DG Broker配置和测试
Oracle RAC 11g DG Broker配置和测试 之前在<RHEL6.4 + Oracle 11g DG测试环境快速搭建参考>已经简单说过. 本篇在实验环境中实际配置 环境: R ...
随机推荐
- 常用python机器学习库总结
开始学习Python,之后渐渐成为我学习工作中的第一辅助脚本语言,虽然开发语言是Java,但平时的很多文本数据处理任务都交给了Python.这些年来,接触和使用了很多Python工具包,特别是在文本处 ...
- 对 Visual Studio 中的Resharper禁用对某种文件的检测
原因:在Visual Studio中安装Reshaper后,就会对各种文件进行代码检测,但是因为Reshaper更新的速度不是很及时,所以有时会对Visual Studio中某些新功能误断,导致Cod ...
- Java基础知识笔记(四:多线程基础及生命周期)
一.多线程基础 编写线程程序主要是构造线程类.构造线程类的方式主要有两种,一种是通过构造类java.lang.Thread的子类,另一种是通过构造方法实现接口java.lang.Runnable的类. ...
- WPF Tookit Chart
如何使用Chart 实例: Binding数据源中是一个KeyValuePair对象.可以是Dictionary. <charting:Chart x:Name="chtSumma ...
- Neutron 理解(10):虚拟专用网(VPN)虚拟化 [How Neutron implements VPN Virtualization]
学习 Neutron 系列文章: (1)Neutron 所实现的虚拟化网络 (2)Neutron OpenvSwitch + VLAN 虚拟网络 (3)Neutron OpenvSwitch + GR ...
- Hibernate里save(),saveOrUpdate(),merge(),update()的区别
save()方法用于将一个临时对象转变为持久化对象,也就是将一个新的业务实体保存到数据库中:update()方法用于将一个游离对象重新转变为持久化对象,也就是更新一个已经存在的业务实体到数据库中:sa ...
- Socket
Socket又称"套接字",应用程序通常通过"套接字"向网络发出请求或者应答网络请求. 以J2SDK-1.3为例,Socket和ServerSocket类库位于 ...
- sqlmap常用技巧
http://nanshihui.github.io/2016/02/25/sqlmaptips/
- 万能的林萧说:一篇文章教会你,如何做到招聘要求中的“要有扎实的Java基础”。
来历 本文来自于一次和群里猿友的交流,具体的情况且听LZ慢慢道来. 一日,LZ在群里发话,"招人啦." 然某群友曰,"群主,俺想去." LZ回之,"你 ...
- Jquery揭秘系列:Validation实现
之前讲了一部分揭秘系列的东西,由于年初的时候在改项目,也没有写下去.现在开始闲下来了,会继续写没写完的东西,各种原生js实现Jquery的功能. 转入正题,说一下今天要讲的东西. 相信很多tx在项目里 ...