NHibernate的数据库连接机制分析和如何使用外部连接

1.普通数据库连接的分析

在一般情况下我们会让NHibernate应用我们让NHibernate自己管理数据库连接。

我们来看看配置文件中和连接有关的配置信息。

< property  name ="connection.provider" > NHibernate.Connection.DriverConnectionProvider </ property >
< property  name ="connection.driver_class" > NHibernate.Driver.SqlClientDriver </ property >
< property  name ="connection.connection_string" > server=.;database=user;uid=sa;pwd=App1234; </ property >
< property  name ="dialect" > NHibernate.Dialect.MsSql2000Dialect </ property >

我们来分析一下这些属性的作用:

connection.provider需配置实现NHibernate.Connection.IConnectionProvider接口的类。
IConnectionProvider定义了创建IDbConnection(用到connection_string)和关闭IDbConnection的功能。
DriverConnectionProvide实现了IConnectionProvider接口,使用IDriver提供的IDbConnection。  
UserSuppliedConnectionProvider实现了IConnectionProvider,使用外部提供的IDbConnection。
ConnectionProviderFactory根据配置文件决定创建何种类型的IConnectionProvider。(让NHibernate自己管理设置DriverConnectionProvide。外部提供连接则无需设置。)





connection.driver_class对应NHibernate.Driver.IDriver接口的类。
描述NHibernate怎么与不同的.NET Data Providers相结合的策略(此处使用了策略模式,关于设计模式可查看Terrylee新版设计模式手册[C#] )。
主要定义了改使用怎样的连接类型和Command类型,以及创建连接和Command的方法(CreateCommand 和 CreateConnection )。
不同的数据库有不同的策略实现。例如:SqlClientDriver提供了访问SQLServer数据的策略(图中省去MySqlDataDriver等多种IDriver)。
 


connection.connection_string提供连接字符串。  

dialect需要配置NHibernate.Dialect.Dialect的子类。 Dialect描述了不同的RDBMS的细节。数据库数据类型和NHibernate数据类型的对应,数据库的函数信息等等。(图中省去多种Dialect)


2.使用外部连接
在某些特殊的时候我们要用到自己提供的连接,例如实现一个连接池管理数据库连接。
注意:使用这种方法的时候切忌不要在一个连接上打开两个并行的ISession

在配置文件中去掉连接的自动管理连接部分的配置.注意dialect不能去掉.


<? xml version="1.0" encoding="utf-8"  ?>
< hibernate-configuration  xmlns ="urn:nhibernate-configuration-2.0" >
    
< session-factory  name ="DDLLY.MyDoc.NHibernateTest.CustomConnect" >
        
<!--  属性  -->
        
<!-- <property name="connection.provider">NHibernate.Connection.DriverConnectionProvider</property>
        <property name="connection.driver_class">NHibernate.Driver.SqlClientDriver</property>
        <property name="connection.connection_string">server=.;database=user;uid=sa;pwd=App1234;</property>
-->
        
< property  name ="show_sql" > true </ property >
        
< property  name ="dialect" > NHibernate.Dialect.MsSql2000Dialect </ property >
        
< property  name ="use_outer_join" > true </ property >
        
< property  name ="query.substitutions" > true 1, false 0, yes 'Y', no 'N' </ property >
        
<!--  映射文件  -->
        
< mapping  assembly ="DDLLY.MyDoc.NHibernateTest.CustomConnect"   />
    
</ session-factory >
</ hibernate-configuration >

代码中需把OpenSession() 改为使用它的重载函数OpenSession(IDbConnection conn)


对我写的快速入门的例子进行了一点改动,实现自行提供连接。定义一个CreateConnection的方法创建新的连接。把ISession session = factory.OpenSession()改为ISession session = factory.OpenSession(CreateConnection());

改后代码如下

using  System.Collections;
using  System.Data.SqlClient;
using  NHibernate;
using  NHibernate.Cfg;
using  NUnit.Framework;
using  System.Data;

namespace  DDLLY.MyDoc.NHibernateTest.CustomConnect
{
    
/// <summary>
    
/// User测试类
    
/// </summary>

    [TestFixture]
    
public class UserFixture
    
{
        
常量

        
SetUp和TearDown

        
私有方法

        
测试方法
    }

}


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值