1

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

<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>
4

2 回答 2

1

您应该为每个 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>

休眠-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 管理器和弹簧的东西,主要是如果你使用的是最新的,我建议你按照我的描述试一试,然后你可以调整它 - 谷歌是你的朋友:)

于 2014-01-17T07:21:31.923 回答
1

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

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

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

oracle-configuration.cfg.xml

<?xml 版本="1.0" 编码="UTF-8"?>

<!DOCTYPE hibernate-configuration PUBLIC
"-//休眠/休眠配置 DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">

<休眠配置>
<会话工厂>
<!-- 数据库连接设置 -->
<property name="connection.driver_class">oracle.jdbc.driver.OracleDriver</property>
<property name="connection.username">范围</property>
<property name="connection.password">范围</property>
<property name="connection.url"> jdbc:oracle:thin:@192.168.0.14:1521:XE </property>

<!-- JDBC连接池(使用内置)-->
<property name="connection.pool_size">1</property>

<!-- SQL方言-->
<property name="dialect">org.hibernate.dialect.Oracle10gDialect</property>

<!-- 禁用二级缓存 -->
<property name="cache.provider_class">org.hibernate.cache.NoCacheProvider</property>

<!-- 将所有执行的SQL回显到stdout -->
<property name="show_sql">真</property>

<!-- 在启动时删除并重新创建数据库模式 -->
<property name="hbm2ddl.auto">创建</property>

<映射资源="com/ranga/mapping/Persom.hbm.xml"/>

</会话工厂>
</hibernate-configuration>
于 2014-05-13T05:43:54.510 回答