具有多个数据库服务器的 ServiceStack OrmLite

Posted

技术标签:

【中文标题】具有多个数据库服务器的 ServiceStack OrmLite【英文标题】:ServiceStack OrmLite with multiple Database Servers 【发布时间】:2012-11-21 09:50:40 【问题描述】:

我正在围绕 servicestack 框架构建一个应用程序,并且需要能够访问 Oracle 和 MS Sql Server 中的数据。这是否可以使用 ORMLite,似乎我只能为应用程序设置一个方言或者我错过了什么?

【问题讨论】:

【参考方案1】:

是的,这是可能的,OrmLiteConnectionFactory 已经内置了对此的支持,请参阅Master SQLServer + Sqlite shard example on OrmLite's project home page。

基本上你会先注册你的默认(或主)连接:

var dbFactory = new OrmLiteConnectionFactory(
  "Data Source=host;Initial Catalog=RobotsMaster;Integrated Security=SSPI", 
  SqlServerDialect.Provider); 

然后您将为您希望支持的每个其他连接注册一个命名连接,例如:

dbFactory.RegisterConnection("shard-1", 
  "~/App_Data/0.sqlite".Fmt(shardId).MapAbsolutePath(),
    SqliteDialect.Provider);

配置完成后,打开连接而不指定名称将打开到默认数据库的连接,例如:

using (IDbConnection db = dbFactory.OpenDbConnection())  ...  //Default DB

虽然您可以指定一个名称以打开与具有不同提供程序的数据库的命名连接,例如:

using (var dbShard = dbFactory.OpenDbConnection("shard-1"))  ...  //Named DB

手动使用不同的方言提供者

不同 RDBMS 之间的 SQL 提供程序实现之间的差异包含在每个方言提供程序中。因此,如果您想针对特定的 ADO.NET 提供程序实现使用 OrmLite 的便利扩展方法,您只需分配您希望使用的 ThreadStatic DialectProvider,例如:

OrmLiteConfig.DialectProvider = SqlServerDialect.Provider;
var dbConn = new SqlConnection(SqlServerConnString);
dbConn.Select<Table>(); //All db access now uses the above dialect provider

这基本上就是 OrmLiteConnectionFactory 中的 RegisterConnection 在幕后自动为您所做的一切。

到目前为止,OrmLite 的所有方言提供程序供参考:

SqlServerDialect.Provider SqliteDialect.Provider(提供不同的 32/64 和 Mono impls) mysqlDialect.Provider PostgreSqlDialect.Provider OracleDialect.Provider FirebirdDialect.Provider

【讨论】:

太棒了,感谢您的快速响应。我没有发现在命名连接中我可以指定方言。我试试看。 请不要在 cmets 中发布代码。创建一个新问题并准确显示您正在尝试执行的操作以及完整的异常详细信息。 在同一工厂中使用两个碰巧使用不同方言提供者的连接发生在我身上的奇怪事情:如果我在辅助连接上打开了一个事务并提交了它但忽略了处理该事务,随后使用第一个连接将使用第二个方言。妥善处理交易解决了我的问题。

以上是关于具有多个数据库服务器的 ServiceStack OrmLite的主要内容,如果未能解决你的问题,请参考以下文章

具有模式的 ServiceStack IRedisClient ScanAllKeys 未按预期返回结果 (ServiceStack 5.7.0)

如何让 ServiceStack 序列化/反序列化具有正确类型的 expando 对象

Redis ServiceStack 使用事务时如何创建多个序列号

如何在 ServiceStack OrmLite 中检索自动递增的 ID?

ServiceStack OrmLite 连接Sqlserver数据库

ServiceStack:VS 2012 添加服务参考