我的应用程序要求是动态创建数据库连接。数据库连接详细信息在编译时是未知的,仅在运行时提供给应用程序。处理一个请求只需要一个连接,连接范围仅限于请求执行周期。相同的用户可能会也可能不会使用数据库连接详细信息发布新请求。我们可以有数百个这样的用户,因此如果假设所有用户同时发布请求,我的应用程序将不得不创建数百个这样的数据库连接。
根据这种情况,我有以下问题/需要澄清 -
编辑: 我的应用程序是更大的Web应用程序的一个组件。这个更大的Web应用程序在云上有自己的存储。任何用户都可以在此存储上创建沙箱。因此,在发出数据加载请求时,用户必须传递凭据。
我是新来的冬眠和春天。请帮我决定最好的架构。
答案 0 :(得分:0)
I think you might find the Open Session in View模式对您的用例感兴趣的内容。您只需要压缩private SessionFactory sf;
字段并在每次调用时构建一个新字段。
或者如果你有一个大堆并且很有可能同一个用户会多次调用,你可以实现某种静态HashMap,将给定用户与给定的SessionFactory相关联,并在已经存在的情况下重用它。
没有关于你的问题:
ThreadLocal
为每个线程(从tomcat管理的池)分配SessionFactory,然后在每次调用时,设置对应于用户的数据源,请参阅下面的代码以下是我在3中谈到的代码。请记住这是糟糕的设计。我也采取了一些快捷方式,以便迅速理解这一伎俩。不知道它是否真的有用,但你可以尝试一下
public class HibernateSessionRequestFilter implements Filter {
private static Logger log = LoggerFactory.getLogger(HibernateSessionRequestFilter.class);
private static ThreadLocal<LocalSessionFactoryBean> lsfbth = new ThreadLocal<LocalSessionFactoryBean>();
private static final Map<Object, DataSource> datasourceMap = new HashMap<>();
public void init(FilterConfig filterConfig) throws ServletException {
log.debug("Initializing filter...");
LocalSessionFactoryBean lsfb = new LocalSessionFactoryBean();
lsfb.setHibernateProperties(null); // TODO: add correct values
lsfbth.set(lsfb);
}
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException,
ServletException {
LocalSessionFactoryBean lsfb = lsfbth.get();
String credentials = null; //TODO: get user login from request
DataSource dataSource = datasourceMap.get(credentials);
if( dataSource==null){
// TODO: build datasource here
datasourceMap.put(credentials, dataSource);
}
lsfb.setDataSource(dataSource);
SessionFactory sf = lsfb.getObject();