在数据源(多个DSs、Spring、Hibernate)以编程方式设置用户名/密码
我正在使用Struts2、Spring和Hibernate开发一个多数据源web门户。我在将用户凭据设置到我的一个数据源时遇到问题,这些凭据在应用程序启动时不可用,但在用户登录时可用。它适用于第一个门户用户,但对后面的每个用户都失败 对于每个数据源,都会创建一个会话工厂,该工厂通过spring配置获取底层数据源集 我的四个数据源中有三个通过配置获得其数据库登录凭据集,但其中一个必须使用门户用户的凭据。注意,我的bean在会话范围内 以下是我的数据源配置:在数据源(多个DSs、Spring、Hibernate)以编程方式设置用户名/密码,spring,hibernate,datasource,credentials,sessionfactory,Spring,Hibernate,Datasource,Credentials,Sessionfactory,我正在使用Struts2、Spring和Hibernate开发一个多数据源web门户。我在将用户凭据设置到我的一个数据源时遇到问题,这些凭据在应用程序启动时不可用,但在用户登录时可用。它适用于第一个门户用户,但对后面的每个用户都失败 对于每个数据源,都会创建一个会话工厂,该工厂通过spring配置获取底层数据源集 我的四个数据源中有三个通过配置获得其数据库登录凭据集,但其中一个必须使用门户用户的凭据。注意,我的bean在会话范围内 以下是我的数据源配置: <!-- data source
<!-- data source with credentials from configuration -->
<bean id="dataSource1" class="org.springframework.jdbc.datasource.DriverManagerDataSource" scope="session">
<property name="driverClassName" value="${jdbc.driverClassName}" />
<property name="url" value="${jdbc.url}" />
<property name="username" value="${jdbc.username}" />
<property name="password" value="${jdbc.password}" />
</bean>
<!-- data source that authenticates with user credentials from login. -->
<bean id="dataSource2" class="org.springframework.jdbc.datasource.DriverManagerDataSource" scope="session">
<property name="driverClassName" value="${ds2.jdbc.driverClassName}" />
<property name="url" value="${ds2.jdbc.url}" />
</bean>
<bean id="sessionFactory1" class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean" scope="session">
<property name="dataSource">
<ref bean="dataSource1" />
</property>
<property name="hibernateProperties">
<props>
<prop key="hibernate.dialect">org.hibernate.dialect.Oracle10gDialect</prop>
...
</props>
</property>
<property name="mappingResources">
<list>
<value>hibernate/AnotherDTO.hbm.xml</value>
...
</list>
</property>
</bean>
<bean id="sessionFactory2" class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean" scope="session">
<property name="dataSource">
<ref bean="dataSource2" />
</property>
<property name="hibernateProperties">
<props>
<prop key="hibernate.dialect">org.hibernate.dialect.Oracle10gDialect</prop>
...
</props>
</property>
<property name="mappingResources">
<list>
<value>hibernate/MyDTO.hbm.xml</value>
...
</list>
</property>
</bean>
我的DAO将会话工厂插入到构造函数中,并将其传递给HibernateDaoSupport是的,我使用HibernateTemplate,请不要就此进行讨论;-:
public class MyDAO extends HibernateDaoSupport {
@Autowired
public MyDAO(@Qualifier("sessionFactory2") SessionFactory pSessionFactory) {
setSessionFactory(pSessionFactory);
}
...
}
现在,对于第一个使用门户的用户来说,这很好。在门户的起始页上,将显示来自使用dataSource2的DAO的项目列表。但是,以下每个登录到门户的用户都不会从my dataSource2获得任何结果。不会引发异常,不会出现日志消息,因为存在到数据库的有效连接,仅使用其他人的凭据,因此不会为第二个用户返回合适的结果
我的假设是,Hibernate或Spring不会以某种方式放弃以前用户的会话工厂中的旧连接并继续使用它,或者忽略我在新数据源上设置的新凭据
任何人都可以提供一些见解或有用的提示或解决方案!解决我的问题?我想知道,如果一个数据源的用户凭据在应用程序启动时不可用,但在用户登录时不可用,并且没有简单通用的方法可用,那么使用该数据源是否真的那么困难?我在web上的任何地方都找不到合适的解决方案
非常感谢。糟透了,糟透了。我刚刚发现使用用户凭据会话工厂的DAO不在会话范围内!这导致刀被视为单刀。我想知道为什么我以前没有看到过这一点?但是,关于如何构建一个使用用户凭据的数据源,登录后可用,而不是应用程序启动时可用的,与我不同的其他伟大解决方案有什么不同?有什么最佳实践吗?
public class MyDAO extends HibernateDaoSupport {
@Autowired
public MyDAO(@Qualifier("sessionFactory2") SessionFactory pSessionFactory) {
setSessionFactory(pSessionFactory);
}
...
}