2012-06-14 26 views
3

我有我的Spring配置(跨两个不同的文件传播)配置这样两个DB提供程序多DB提供程序 - 无DB提供可用

<db:provider id="FirstDbProvider" 
        provider="MySql"     connectionString="Database=xxxxxxx;Host=xxxxxxx;Username=xxxxxxx;Password=xxxxxxxxx"/> 

    <db:provider id="SecondDbProvider" 
        provider="MySql"     connectionString="Database=xxxxxxx;Host=xxxxxxx;Username=xxxxxxx;Password=xxxxxxxxx"/> 

但是当我尝试运行我的应用程序,它失败当创建使用SecondDBProvider的sessionFactory时。我得到这个

SecondSessionFactory文件”中定义的‘[Second.Dao.xml]第21行’:对象的初始化失败:没有DB提供程序可用,无法建立连接

我应该即可使用两种数据库提供者以这种方式?任何想法可能会导致此错误。我可以使用我的数据库提供程序中指定的凭证等从命令行连接到数据库。

如果我回到只有一个数据库的话,它可以很好地工作。 我可以将第二个db:provider添加到我的spring.dao.xml文件中,并且它仍然可以工作(即,我可以从第一个数据库检索实体)。 只有当我添加第二个sessionFactory时,它停止工作,我无法检索任何内容,甚至不能从第一个数据库中取回任何内容。

所以,我想一些地方正在也许是共享的,导致冲突

更新

这里的配置(我改名一些事情出于显而易见的原因)

<?xml version="1.0" encoding="utf-8" ?> 
<objects xmlns="http://www.springframework.net" 
     xmlns:db="http://www.springframework.net/database"> 

    <!-- Referenced by main application context configuration file --> 
    <description> 
    Config for Database 1 
    </description> 

    <!-- Property placeholder configurer for database settings --> 
    <object type="Spring.Objects.Factory.Config.PropertyPlaceholderConfigurer, Spring.Core"> 
    <property name="ConfigSections" value="databaseSettings"/> 
    </object> 

    <!-- Database Configuration --> 
    <db:provider id="FirstDbProvider" 
        provider="MySql" 
        connectionString="Database=xxxxx;Host=xxxxxxx;Username=xxxxxx;Password=xxxxxx"/> 

    <!-- NHibernate Configuration --> 
    <object id="FirstSessionFactory" type="Utils.Hibernate.CustomLocalSessionFactoryObject, Utils"> 
    <property name="DbProvider" ref="FirstDbProvider"/> 
    <property name="MappingAssemblies"> 
     <list> 
     <value>FirstDao.Dao</value> 
     </list> 
    </property> 
    <property name="HibernateProperties"> 
     <dictionary> 
     <entry key="hibernate.connection.provider" value="NHibernate.Connection.DriverConnectionProvider"/> 
     <entry key="dialect" value="NHibernate.Dialect.MySQLDialect"/> 
     <entry key="connection.driver_class" value="NHibernate.Driver.MySqlDataDriver"/> 
     <entry key="use_proxy_validator" value="false" /> 
     <entry key="show_sql" value="true"/> 
     <entry key="format_sql" value="false"/> 
     <entry key="generate_statistics" value="false"/> 
     <entry key="adonet.batch_size" value="20"/> 
     <entry key="hbm2ddl.auto" value="update"/> 
     <entry key="prepare_sql" value="true"/> 
     </dictionary> 
    </property> 
    <property name="ExposeTransactionAwareSessionFactory" value="true" /> 
    </object> 


    <!-- Transaction Management Strategy - local database transactions --> 
    <object id="transactionManager" 
     type="Spring.Data.NHibernate.HibernateTransactionManager, Spring.Data.NHibernate32"> 

    <property name="DbProvider" ref="FirstDbProvider"/> 
    <property name="SessionFactory" ref="FirstSessionFactory"/> 

    </object> 

    <!-- Exception translation object post processor --> 
    <object type="Spring.Dao.Attributes.PersistenceExceptionTranslationPostProcessor, Spring.Data"/> 

    <!-- Data Access Objects --> 
    <object id="firstDao" type="FirstDao.Dao.MyDao, HRDataCheck.Dao"> 
    <property name="SessionFactory" ref="FirstSessionFactory"/> 
    </object> 

</objects> 

这里是我的第二个文件(用于其他DBProvider)

<?xml version="1.0" encoding="utf-8" ?> 
<objects xmlns="http://www.springframework.net" 
     xmlns:db="http://www.springframework.net/database"> 


    <!-- Database Configuration --> 
    <db:provider id="SecondDbProvider" 
        provider="MySql" 
        connectionString="Database=xxxxxx;Host=xxxxxx;Username=xxxxx;Password=xxxxxxxx"/> 

    <!-- NHibernate Configuration --> 
    <object id="SecondSessionFactory" type="Utils.Hibernate.CustomLocalSessionFactoryObject, Utils"> 
    <property name="DbProvider" ref="SecondDbProvider"/> 
    <property name="MappingAssemblies"> 
     <list> 
     <value>SecondDao.Dao</value> 
     </list> 
    </property> 
    <property name="HibernateProperties"> 
     <dictionary> 
     <entry key="hibernate.connection.provider" value="NHibernate.Connection.DriverConnectionProvider"/> 
     <entry key="dialect" value="NHibernate.Dialect.MySQLDialect"/> 
     <entry key="connection.driver_class" value="NHibernate.Driver.MySqlDataDriver"/> 
     <entry key="use_proxy_validator" value="false" /> 
     <entry key="show_sql" value="true"/> 
     <entry key="format_sql" value="false"/> 
     <entry key="generate_statistics" value="false"/> 
     <entry key="adonet.batch_size" value="20"/> 
     <entry key="prepare_sql" value="true"/> 
     </dictionary> 
    </property> 
    <property name="ExposeTransactionAwareSessionFactory" value="true" /> 
    </object> 


    <!-- Data Access Objects --> 
    <object id="secondDao" type="Blah.SecondDao, SecondDaoAssembly"> 
    <property name="SessionFactory" ref="SecondSessionFactory"/> 
    </object> 

</objects> 
+0

是你的数据库供应商在2个独立的文件吗?如果是这样,你是否将两个都添加到app.config文件? –

+1

我试过两种方式塞巴斯蒂安。我想我只是在某个地方弄错了一些配置。如果我可以找到一个有两个数据库提供者的好工作示例(以及一些时间),我将在此处发布解决方案,但目前我的应用程序仅限于1分贝提供程序(我正在为其他数据库使用ADO) – Richard

回答

2

这是你的问题:你的SecondSessionFactory没有事务管理设置。

<object id="transactionManager" 
     type="Spring.Data.NHibernate.HibernateTransactionManager, Spring.Data.NHibernate32"> 
    <property name="DbProvider" ref="FirstDbProvider"/> 
    <property name="SessionFactory" ref="FirstSessionFactory"/> 

    </object> 

尝试 <!--Transaction Management Strategy - local database transactions--> <object id="transactionManager" type="Spring.Data.Core.TxScopeTransactionManager, Spring.Data"> <property name="TransactionSynchronization" value="Always"/> </object>

+0

感谢Portalus,只是看到了你的答案。我将在即将启动的项目中使用此解决方案。 – Richard

相关问题