【问题标题】:how to fetch data of remote side database in hibernate如何在休眠中获取远程端数据库的数据
【发布时间】:2014-01-17 07:12:21
【问题描述】:

我正在开发一个报告工具的应用程序。
我必须使用它们的凭据连接多个远程端数据库并获取数据库值。
我该怎么做?
这是我的休眠配置文件

<hibernate-configuration>
  <session-factory>

    <property name="hibernate.dialect">org.hibernate.dialect.MySQL5InnoDBDialect</property>
    <property name="dialect">org.hibernate.dialect.MySQLDialect</property>

    <property name="show_sql">true</property>
   <property name="hibernate.hbm2ddl.auto">update</property>

    <property name="hibernate.connection.SetBigStringTryClob">true</property>

    <property name="hibernate.jdbc.batch_size">0</property>

  </session-factory>
</hibernate-configuration>

【问题讨论】:

    标签: hibernate hibernate.cfg.xml


    【解决方案1】:

    对于连接多个数据库,编写一个会话工厂并不好。所以如果你想连接多少个数据库,编写那么多配置文件是最好的方法。例如假设,我想连接 oracle, mysql 数据库。所以我能做的是我将为 oracle 编写一个配置文件,即 oracle-configuration.cfg.xml 和 mysql 我将创建 mysql-configuration.cfg.xml

    现在您的问题是连接远程数据库,您需要提供带有凭据的远程地址。

    例如,我的远程数据库地址是192.168.0.14。现在我想连接oracle数据库 现在像

    这样的连接属性

    oracle-configuration.cfg.xml

    眠/休眠配置 DTD 3.0//EN"
    "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
    
    
    
    
    oracle.jdbc.driver.OracleDriver范围范围jdbc:oracle:thin:@192.168.0.14:1521:XE1org.hibernate.dialect.Oracle10gDialectorg.hibernate.cache.NoCacheProvider创建会话工厂>
     

    【讨论】:

      【解决方案2】:

      您应该为每个 DBS 配置单独的会话工厂和数据源配置,并且您可以参考正确的配置,例如通过数据源名称。

      这意味着如果您有 3 个远程数据库,那么理想情况下您应该有 3 个 sessionFacories 和数据源。

      例子:

      hibernate-first.cfg.xml - 和你的一样

      <hibernate-configuration>
        <session-factory>
      
          <property name="hibernate.dialect">org.hibernate.dialect.MySQL5InnoDBDialect</property>
          <property name="dialect">org.hibernate.dialect.MySQLDialect</property>
      
          <property name="show_sql">true</property>
         <property name="hibernate.hbm2ddl.auto">update</property>
      
          <property name="hibernate.connection.SetBigStringTryClob">true</property>
      
          <property name="hibernate.jdbc.batch_size">0</property>
      
          <!-- Here commes the entities mapped to tables in the FIRST database -->
          <mapping class="com.yourpackage.EntityOftheFirstDatabase" />
      
        </session-factory>
      

      hibernate-second.cfg.xml

      <hibernate-configuration>
        <session-factory>
      
          <property name="hibernate.dialect">org.hibernate.dialect.MySQL5InnoDBDialect</property>
          <property name="dialect">org.hibernate.dialect.MySQLDialect</property>
      
          <property name="show_sql">true</property>
         <property name="hibernate.hbm2ddl.auto">update</property>
      
          <property name="hibernate.connection.SetBigStringTryClob">true</property>
      
          <property name="hibernate.jdbc.batch_size">0</property>
      
          <!-- Here commes the entities mapped to tables in the SECOND database -->
          <mapping class="com.yourpackage.EntityOftheSecondDatabase" />
      
        </session-factory>
      

      现在让我们在 spring 中配置会话工厂:

      <!-- Hibernate SessionFactory for the FIRST database -->
          <bean id="sessionFactoryForTheFirstDatabase" class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">
              <property name="dataSource" ref="dataSourceForTheFirstDatabase" />
              <property name="configLocation" value="classpath:hibernate-first.cfg.xml" />
          </bean>
      
      
      
      <!-- Hibernate SessionFactory for the SECOND database -->
              <bean id="sessionFactoryForTheSecondDatabase" class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">
                  <property name="dataSource" ref="dataSourceForTheSecondDatabase" />
                  <property name="configLocation" value="classpath:hibernate-second.cfg.xml" />
              </bean>
      

      数据源

      <bean id="dataSourceForTheFirstDatabase" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
              <property name="driverClassName" value="your specific" />
              <property name="url" value="${database.url}" />
              <property name="username" value="${database.username}" />
              <property name="password" value="${database.password}" />
          </bean>
      

      第二个数据源是一样​​的,只是指向第二个数据库。如果您想配置 Tx 管理,那么您的数据库需要两个事务管理器:

      <bean id="firstDbServiceProxyCreator" class="org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator">
              <description>Transaction boundaries are mapped to service layer</description>
              <property name="proxyTargetClass" value="false" />
              <property name="beanNames">
                <list>
              <value>ServicesMangingoperationsAboveYourFirstDatabase1</value>
              <value>ServicesMangingoperationsAboveYourFirstDatabase2</value>
                </list>
              </property>  
              <property name="interceptorNames">
                <list>
                  <value>FirstDbTxInterceptor</value>
                </list>
              </property>
          </bean>
      

      如果您想跨多个数据库进行单个事务也是可能的,只是不知道您是否需要它!希望这对你来说已经足够清楚了。我知道有更多奇特的方法来定义 TX 管理器和弹簧的东西,主要是如果你使用的是最新的,我建议你按照我的描述试一试,然后你可以调整它 - 谷歌是你的朋友:)

      【讨论】:

      • 编辑了我的信息,希望我的描述性足够 :)
      • 如果您发现该帖子有用并且对您有用,您可以将问题标记为已回答。对于面临同样问题的其他人来说,这也可能是有益的。
      • 当然...但我找不到已回答的按钮。
      • 当然,如果我的评论比是的,我很高兴!
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-11-12
      • 1970-01-01
      • 2016-10-04
      • 1970-01-01
      相关资源
      最近更新 更多