简介: 我有这个ASP.NET Webforms站点的特殊性,它不只有1个数据库,它有很多.为什么?因为您可以即时创建站点的新"实例".每个"实例"共享相同的代码库,但拥有自己的数据库.这些所有数据库都具有相同的模式(结构),但当然是不同的数据.不要问'你为什么不把所有东西放在一个数据库中,并使用InstanceId知道哪个是"因为这是一个商业政策的事情.
由于url,应用程序知道正在请求哪个实例.有一个额外的数据库来完成这个(我知道它在设计时的连接字符串).此数据库只有2个表,并将URL与"应用程序实例"关联.然后,当然,每个"应用程序实例"都有其关联的连接字符串.
当前情况:现在没有任何东西可以帮助我们同步保存每个实例数据库(将模式更改传播到每个实例).所以我们手工完成,当然这是一团糟.
问题:我想使用rails-migration方式来处理模式更改,最好是migratordotnet,但如果更容易设置,可以使用任何其他方法.
问题是migratordotnet需要在proj.build文件中声明连接字符串,直到运行时我才知道它们.
真正有用的是在Application_Start上运行的某种方法,它将最新的迁移应用于每个数据库.
如何通过migratordotnet或任何类似的方式完成?任何其他建议都值得欢迎.
谢谢!
我有一个相当标准的Java EE6 Web应用程序使用JPA 2,依赖注入连接到MySQL数据库,一切正常.我现在要做的是让这个应用程序与我们在客户端站点安装的其他应用程序的数据库进行交互 - 基本上作为我们其他应用程序安装的单一控制点.
我正在努力的是如何最好地与其他数据库进行交互.理想情况下,我想为每次安装创建一个EntityManager并使用JPA进行交互,但我看不出任何设置方法.例如,我可能有一个应用程序类型的5个安装(以及数据库),并且主控制应用程序在运行时之前不会知道其他安装.这似乎排除了使用EntityManager的依赖注入和所有自动事务demacation等等.替代选项是只创建一个DataSource并手动进行交互.虽然灵活,但这显然需要更多的努力.
所以,我的问题是如何最好地解决这个问题?
我正在尝试与另一台服务器上的另一个数据库建立第二个数据库连接.我们正在使用play framework 1.2.4,我找到了1.2.3的以下文档.
http://www.playframework.org/documentation/1.2.3/model#multiple
application.conf:
db_other.url=jdbc:mysql://localhost/test
db_other.driver=com.mysql.jdbc.Driver
db_other.user=root
db_other.pass=
Connection conn = DB.getDBConfig("other").getConnection()
Run Code Online (Sandbox Code Playgroud)
这对我没有用,所以我做了一些搜索并找到了以下文章.这篇文章告诉我,上面的配置从1.3主分支泄露,将来可用...
在Play的API上找不到JPA.getJPAConfig方法
https://play.lighthouseapp.com/projects/57987/tickets/706
任何人都可以给我一个方法来对其他数据库做一些简单的查询吗?我想我不是唯一想要使用多个数据库的人.
谢谢!
我一直在寻找使用CodeIgniter的多个数据库.如果我提前知道数据库是什么,那么我可以在配置文件中设置信息,然后调用我需要的任何数据库组.
但是,在我的情况下,我需要将该数据库信息存储在另一个数据库中.它是一种主数据库,包含有关客户的一般信息,包括存储客户数据的数据库和凭据.然后,该供应商可以随时添加客户,并将每个客户的数据分隔在不同的数据库中.
如何根据我从CodeIgniter中的master数据库返回的值设置数据库和凭据,或者甚至有办法做到这一点?
谁能指出我正确的方向?提前感谢任何建议.
当我自己找到解决方案的时候,我以为我会在那里得到这个问题.
在构建了大量应用程序之后,我有最后一分钟的要求来支持读/写一个额外的数据库(总共2个,没有已知的其他数据库).我使用NHibernate构建了应用程序,Autofac提供了DI/IoC组件.FWIW,它驻留在ASP.NET MVC 2应用程序中.
我有一个通用的存储库类,它采用NHibernate会话.理论上,我可以继续使用这个通用存储库(IRepository<>)为第二个数据库,只要传递给它的会话是从适当的SessionFactory生成的,对吧?
好吧,当应用程序启动时,Autofac会做到这一点.关于Session和SessionFactory,我有一个模块说明:
builder.Register(c => c.Resolve<ISessionFactory>().OpenSession())
.InstancePerMatchingLifetimeScope(WebLifetime.Request)
.OnActivated(e =>
{
e.Context.Resolve<TransactionManager>().CurrentTransaction = ((ISession)e.Instance).BeginTransaction();
});
builder.Register(c => ConfigureNHibernate())
.SingleInstance();
Run Code Online (Sandbox Code Playgroud)
返回基本SessionFactory的ConfigureNHibernate()看起来像:
private ISessionFactory ConfigureNHibernate()
{
Configuration cfg = new Configuration().Configure();
cfg.AddAssembly(typeof(Entity).Assembly);
return cfg.Configure().BuildSessionFactory();
}
Run Code Online (Sandbox Code Playgroud)
目前,这仅限于一个数据库.在任何其他NHib场景中,我可能会将单独的SessionFactories的实例推送到哈希中,并根据需要检索它们.我不想重新设计整个事情,因为我们非常接近主要版本.所以,我猜我至少需要修改上面的方法,以便我可以独立配置两个SessionFactories.我的灰色区域是如何指定正确的工厂与特定存储库一起使用(或至少对于特定于第二个数据库的实体).
任何人都有使用IoC容器和NHibernate这种方式的经验吗?
编辑 我已经删除了一个GetSessionFactory方法,它接受一个配置文件路径,检查HttpRuntime.Cache中匹配的SessionFactory的存在,创建一个新实例(如果还没有),并返回该SessionFactory.现在我仍然需要知道如何告诉Autofac如何以及何时指定适当的配置路径.新方法看起来像(比利2006年后大量举债这里):
private ISessionFactory GetSessionFactory(string sessionFactoryConfigPath)
{
Configuration cfg = null;
var sessionFactory = (ISessionFactory)HttpRuntime.Cache.Get(sessionFactoryConfigPath);
if (sessionFactory == null)
{
if (!File.Exists(sessionFactoryConfigPath))
throw new FileNotFoundException("The nhibernate configuration file at '" + sessionFactoryConfigPath + "' could not be found.");
cfg …Run Code Online (Sandbox Code Playgroud) 我在symfony2 + doctrine2中有2个数据库db1和db2,两个数据库在表及其字段方面彼此不同.我需要处理迁移问题.只要有一个数据库,事情就可以正常工作.但是当有多个数据库时,它不起作用.
此外,有什么方法可以提供实体管理器特定的迁移设置.或者有什么办法可以在迁移类中提供连接或实体管理器.
请帮助.
谢谢..
我有两个数据库,每个数据库都有自己的dbcontext.我设置了两个迁移配置.我可以为第一个db ust fine(Add-Migration DB1_InitialCreate -ConfigurationTypeName DB1Configuration)添加一个迁移.当我尝试使用:使用第二个db创建初始迁移时Add-Migration DB2_InitialCreate -ConfigurationTypeName DB2Configuration,我收到以下错误:
由于以下显式迁移未决,因此无法生成显式迁移:[201205082215265_DB1_InitialCreate].在尝试生成新的显式迁移之前应用挂起的显式迁移.
所以我按照它说的做,并用以下内容更新数据库:
Update-Database -ConfigurationTypeName DB1Configuration
Run Code Online (Sandbox Code Playgroud)
然后我尝试再次为第二个数据库添加迁移,但我一直收到相同的错误.
有关如何使迁移适用于两个数据库/上下文的任何想法?
entity-framework multiple-databases code-first ef-migrations
问题接着来自Fluent NHibernate +多个数据库(不需要关注此链接,这里应该有足够的背景).
我的问题是:
我正在使用Fluent NHibernate.我的应用使用多个数据库.每个数据库都有自己的实体注册(映射)它.结果是具有多个会话工厂,每个工厂与单个DB相关,并且每个会议工厂"包含"其自己的一组映射实体.
对于加载实体,我创建了一个通用的Factory类,它提供了一些可用于任何注册实体(在任何DB中)的标准加载方法.问题是:加载方法需要为我正忙着处理的实体类使用正确的会话工厂.我如何确定需要使用哪个会话工厂?我手头有所有的Session Factories(并且由数据库名称索引),我只需要一种方法,只知道我要加载的实体的类型,选择正确的Session Factory来使用.
例如:
public IBaseBusinessObject CreatePopulatedInstance(Type boType, Guid instanceKey)
{
IBaseBusinessObject result = null;
ISessionFactory sessionFactory = GetSessionFactory(boType);
using (ISession session = sessionFactory.OpenSession())
{
using (session.BeginTransaction())
{
result = (IBaseBusinessObject)session.Get(boType, instanceKey);
}
}
return result;
}
Run Code Online (Sandbox Code Playgroud)
需要在GetSessionFactory(boType)中进行什么?
谢谢阅读!
我们目前正在开发基于NHibernate和ASP.NET MVC以及SQL Server后端的应用程序.由于我是NHibernate的新手,我试着去了解最佳实践.
我们的应用程序要求每个用户拥有自己的SQL Server数据库.这些数据库都具有相同的结构.
我们的客户使用客户代码进行识别,例如1500.
我们已经为nHibernate提供了一个自定义连接提供程序,我们已经在nServiceBus后端服务中使用了它:
public class DynamicConnectionProvider : DriverConnectionProvider
{
public override IDbConnection GetConnection()
{
IDbConnection conn = Driver.CreateConnection();
try
{
var messageExecutionContext = ServiceLocator.Current.GetInstance<ITTTContextProvider>().CurrentContext;
if (messageExecutionContext.CustomerId == 0)
{
conn.ConnectionString = ConfigurationManager.ConnectionStrings["dev"]
.ConnectionString;
}
else
{
conn.ConnectionString = ConfigurationManager.ConnectionStrings["default"]
.ConnectionString
.FormatWith(messageExecutionContext.CustomerId);
}
conn.Open();
}
catch (Exception)
{
conn.Dispose();
throw;
}
return conn;
}
}
Run Code Online (Sandbox Code Playgroud)
此连接提供程序检查上下文对象中的客户代码,并相应地设置连接字符串.
我们计划提供一个HttpContext识别ITTTContextProvider.为此,我有两个问题:
我们如何从URL中检索客户代码并将其放入每个请求的上下文对象中?当我们使用以下路线?
<main-site-url>/{customercode}/{controller}/{action}/{id}
这种连接到几个相同数据库的方法是否有效,或者构建sessionfactory foreach客户数据库是否更好?
nhibernate asp.net-mvc multiple-databases s#arp-architecture
我正在使用Django 1.3.1.我有两个数据库,我的一些模型存在于一个数据库中,一些存在于另一个数据库中.这两个数据库都是contrib.gis.db.backends.postgis数据库.
令我惊讶的是,Django的TestCase并没有回滚我在测试之间在辅助数据库中所做的更改.
在下面的代码中,myproject.models.WellOwner是一个非常简单的模型,基本上只有一个字段"name".路由器说它应该在辅助数据库中.第一次测试中的断言成功,第二次测试失败:
from django.test import TestCase
from myproject.models import WellOwner
class SimpleTest(TestCase):
def test1(self):
WellOwner.objects.create(name="Remco")
self.assertEquals(1, WellOwner.objects.count()) # Succeeds
class SimpleTest2(TestCase):
def test2(self):
# I would expect to have an empty database at this point
self.assertEquals(0, WellOwner.objects.count()) # Fails!
Run Code Online (Sandbox Code Playgroud)
我假设Django将此包装在默认数据库的事务中,但不包含在辅助数据库上.这是一个已知的问题吗?有修复吗?也许在1.4?我的Google-fu失败了.
(如果我在设置中将DATABASE_ROUTERS更改为[],以便所有内容都进入同一个数据库,问题就会消失)
我将添加路由器的整个代码,以防它有用:
SECONDARY_MODELS = ('WellOwner', ...)
import logging
logger = logging.getLogger(__name__)
class GmdbRouter(object):
"""Keep some models in a secondary database."""
def db_for_read(self, model, **hints):
if model._meta.app_label == 'gmdb':
if model._meta.object_name in SECONDARY_MODELS:
return 'secondary'
return None
def db_for_write(self, …Run Code Online (Sandbox Code Playgroud) asp.net-mvc ×2
c# ×2
migration ×2
nhibernate ×2
asp.net ×1
autofac ×1
code-first ×1
codeigniter ×1
database ×1
django ×1
doctrine-orm ×1
java ×1
jpa ×1
python ×1