多个数据库提供程序 - 无数据库提供程序可用

时间:2012-06-14 10:29:11

标签: nhibernate spring.net

我在我的spring配置中配置了两个数据库提供程序(分布在两个不同的文件中)

<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时失败。我明白了

在'file [Second.Dao.xml]第21行'中定义的

SecondSessionFactory':对象初始化失败:没有可用的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>

1 个答案:

答案 0 :(得分: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>