2012-06-14 56 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

相關問題