当前位置: 首页 > 面试题库 >

Spring + Hibernate SessionFactory + AbstractRoutingDataSource

周超英
2023-03-14
问题内容

我有一个Spring + Hibernate /
Flex应用程序,需要在数据库模式之间动态切换。为了实现这个目标我实现了一个AbstractRoutingDataSource下面这个文章。不幸的是,它不起作用。它实际上以默认架构(logical_public)执行SQL。任何帮助将不胜感激。谢谢。

这是我的设置:

applicationContext.xml
包含两个数据源。每个数据源都以不同的登录角色连接到数据库。路由数据源通过使用String键选择正确的数据源。SchemaConstants类包含几个
公共的static final 字段。

<bean id="parentDataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource" destroy-method="close">
    <property name="driverClass" value="org.postgresql.Driver"/>
    <property name="jdbcUrl" value="jdbc:postgresql://localhost:5432/mystore"/>
    <property name="acquireIncrement" value="3"/>
    <property name="minPoolSize" value="1"/>
    <property name="maxPoolSize" value="15"/>
    <property name="maxStatementsPerConnection" value="100"/>
    <property name="automaticTestTable" value="c3p0_test_table"/>
    <property name="numHelperThreads" value = "20"/>
</bean>

<bean id="publicDS" parent="parentDataSource">
    <property name="user" value="postgres"/>
    <property name="password" value="password"/>
</bean>

<bean id="tempSchemaDS" parent="parentDataSource">
    <property name="user" value="temp_role"/>
    <property name="password" value="tmppsw"/>
</bean>

<bean id="routingDS" class="flex.RoutingDataSource">
   <property name="targetDataSources">
      <map key-type="java.lang.String">
         <entry key="flex.SchemaConstants.LOGICAL_PUBLIC" value-ref="publicDS"/>
         <entry key="flex.SchemaConstants.TEMP_SCHEMA" value-ref="tempSchemaDS"/>
      </map>
   </property>
   <property name="defaultTargetDataSource" ref="publicDS"/>
</bean>

RoutingDataSource实现: 在这里没有什么可添加的。

public class RoutingDataSource extends AbstractRoutingDataSource
{
    @Override
    protected Object determineCurrentLookupKey()
    {
        return Globals.getSchema();
    }

    @Override
    public Logger getParentLogger() throws SQLFeatureNotSupportedException
    {
        // TODO Auto-generated method stub
        return null;
    }
}

Globals类: 用于存储和查找数据源密钥。

public class Globals
{
    private static final ThreadLocal<String> schemaHolder 
        = new ThreadLocal<String>();

    public static void setSchema(String schema)
    {
        schemaHolder.set(schema);
    }

    public static String getSchema()
    {
        return schemaHolder.get();
    }

    public static void clearCustomerType()
    {
        schemaHolder.remove();
    }
}

测试代码: 尝试插入几条记录,每条记录都在不同的架构(和不同的表)中

@RemotingInclude
@Transactional
public void test()
{
    Globals.setSchema(SchemaConstants.TEMP_SCHEMA);

    SomeDataOther someOtherData = new SomeDataOther();
    someOtherData.setName("Jorjinio");
    this.sessionFactory.getCurrentSession().save(someOtherData);


    Globals.setSchema(SchemaConstants.LOGICAL_PUBLIC);

    SomeData someData = new SomeData();
    someData.setFirstName("Hulio");
    someData.setLastName("Julio");
    this.sessionFactory.getCurrentSession().save(someData);
}

第二个问题。在这种情况下,保持数据完整性的正确方法是什么?我已经用 @Transactional
属性注释了该方法,但是我不确定这将如此容易地工作。我正在使用的transactionManager的类型为org.springframework.orm.hibernate3.HibernateTransactionManager。我尚未对此事进行任何研究,但如果有人可以提供信息,也将不胜感激。


问题答案:

显然,对特定对象的选择DataSource实际上AbstractRoutingDataSource.getConnection()是在调用时发生的,即在Session创建受事务绑定的Hibernate时。在您的情况下,当您输入@Transactional方法时会发生这种情况。

因此,您不能在事务内部切换方案。您必须针对不同的方案执行单独的事务。要以相同的方法执行多个事务,可以使用程序化事务管理(TransactionTemplate)代替@Transactional



 类似资料:
  • 有人知道如何获得由Spring Boot创建的Hibernate SessionFactory的句柄吗?

  • Spring是一个流行的Web框架,可以轻松集成许多常见的Web任务。 所以问题是,当我们拥有Struts2时,为什么我们需要Spring呢? 好吧,Spring不仅仅是一个MVC框架 - 它提供了很多Struts中没有的其他好东西。 例如:依赖注入可以对任何框架有用。 在本章中,我们将通过一个简单的示例来了解如何将Spring和Struts2集成在一起。 首先,您需要将以下文件添加到Spring

  • 作为一个新的Web应用程序项目的一部分,我计划学习Spring。我开始通读Spring框架参考。当我在谷歌上搜索时,我遇到了Spring boot。我所理解的是,Spring boot通过减少配置帮助构建应用程序的速度比Spring快得多。现在我有点困惑,我应该继续学习Spring还是跳转到Spring boot。我的目的是了解Spring作为一个框架是如何工作的,而不是一些特性。所以请让我知道,

  • 我正在研究Spring支持的数据访问技术,我注意到它提到了多个选项,但我不确定它们之间的区别: Spring-DAO(http://docs.spring.io/spring/docs/2.0.8/reference/dao.html) Spring-orm(http://docs.spring.io/spring/docs/3.0.x/spring-framework-reference/htm

  • 服务器应为无状态 不能期望客户端存储Cookie。 发送到服务器的凭据不应为纯文本 我是Spring Security的新手,因此如果我能在实现它时得到任何帮助,我将不胜感激。

  • 问题内容: 我正在启动一个新的JSF(2)项目。我意识到纯JSF有一定的局限性,我计划在春季停产。在春季,JSF是一种相对较新的方法(中甚至没有标记spring-faces :-)),jsp是经典方法。 我需要对技术堆栈进行最佳调整。 1)我也需要使用spring网流吗? 2)仅使用spring面(似乎是流的一部分)+spring mvc + JPA是否可行? 3)是否有这种配置的良好示例? 问题