gpt4 book ai didi

java - 处理动态数据库连接

转载 作者:太空宇宙 更新时间:2023-11-04 12:05:38 26 4
gpt4 key购买 nike

我的应用程序要求是动态创建数据库连接。数据库连接详细信息在编译时未知,仅在运行时提供给应用程序。处理一个请求只需要一个连接,连接的范围仅限于请求执行周期。同一用户可能会也可能不会发布带有数据库连接详细信息的新请求。我们可以有数百个这样的用户,因此,如果假设所有用户同时发出请求,我的应用程序将必须创建数百个这样的数据库连接。

基于这种情况,我有以下问题/需要澄清-

  1. 连接池在这里不起作用,因为数据库连接 动态的?
  2. 在这种情况下创建数据库连接的最佳方法是什么?纯 JDBC 连接在这里最好吗?
  3. 为每个请求创建hibernate session 工厂,仅仅创建单个连接会造成开销吗?或者我们可以这样做吗?
  4. 还有哪些其他可能的好方法来处理这种情况?

编辑:我的应用程序是一个更大的 Web 应用程序的组件。这个更大的 Web 应用程序在云上有自己的存储。任何用户都可以在此存储上创建沙箱。因此,在发出数据加载请求时,用户必须传递凭据。

我是 hibernate 和 spring 的新手。请帮助我决定最好的架构。

最佳答案

我想你可能会找到Open Session in View您的用例感兴趣的模式。您只需抑制 private SessionFactory sf; 字段并在每次调用时构建一个新字段即可。

或者,如果您有一个很大的堆,并且同一个用户很可能会多次调用,您可以实现某种静态 HashMap,将给定用户与给定 SessionFactory 关联起来,并重用它(如果已经存在)。

不,关于你的问题:

  1. 除非您自己实现连接池,否则它是不可能实现的。但在考虑之前,先问问自己,同一个用户是否有可能同时需要多个连接。
  2. 我认为我建议的解决方案是最糟糕的解决方案之一,前提是您需要 hibernate 支持来管理您的实体
  3. 这会造成开销,除了深入框架进行攻击之外没有其他办法可以解决这个问题,并可能产生不良副作用。例如,您可以想象使用 ThreadLocal 为每个线程分配一个 SessionFactory(从 tomcat 管理的池中),然后在每次调用时设置与用户相对应的数据源,请参阅下面的代码
  4. 您必须提供有关您的申请及其内部的更多详细信息,然后我才能(也许)就这一点向您提供建议。

这是我在 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();

关于java - 处理动态数据库连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40396019/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com