restricted access是啥意思
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了restricted access是啥意思相关的知识,希望对你有一定的参考价值。
restricted access[英][rɪˈstrɪktɪd ˈækses][美][rɪˈstrɪktɪd ˈæksɛs]
受限存取;
例句:
1.
Your firewall administrator has restricted access to the www service.
你的防火墙管理员限制你访问这个站点。
2.
Less restricted access to internal web sites.
内部网站访问的限制更少。
3.
Deconstructing the sequence of events, and understanding how a stock market with restricted access for foreign investors can influence global markets to such an extent is preoccupying many a fund manager and analyst.
很多基金经理和分析师都在全神贯注地剖析这一事件的后果,试图弄清一个限制外国投资者进入的股市如何能够对全球市场产生这么大影响。
4.
Strong ip protection could affect society negatively, for example, patents and pharmaceutical products could lead to high prices of medicines that restricted access to medicines.
知识产权保护过强会给社会带来负面影响,比如专利药品会导致药品价格过高,从而限制人们获得药品。
5.
Note: if the discussion takes place inside a restricted access web site, posted articles will automatically contain the registered names of the users who submitted them. You'll need to change the site permissions after the wizard finishes.
注意:如果对网站讨论进行限制,提交讨论的用户的注册名会自动包含在发表的文章中。向导完成后,您必须更改网站权限。 参考技术A 呈架民力宾搬离
使用大型列表解决 Restrictions.in 的更好方法是啥?
【中文标题】使用大型列表解决 Restrictions.in 的更好方法是啥?【英文标题】:What is the better approach for solving Restrictions.in with large lists?使用大型列表解决 Restrictions.in 的更好方法是什么? 【发布时间】:2015-09-19 18:48:27 【问题描述】:已经确定,当你使用Hibernate的Restrictions.in(String property, List list)时,你必须限制list的大小。 这是因为数据库服务器可能无法处理长查询。除了调整数据库服务器的配置。
以下是我找到的解决方案:
解决方案 1: 将列表拆分为较小的列表,然后将较小的列表分别添加到多个 Restrictions.in 中
public List<Something> findSomething(List<String> subCdList)
Criteria criteria = getSession().createCriteria(getEntityClass());
//if size of list is greater than 1000, split it into smaller lists. See List<List<String>> cdList
if(subCdList.size() > 1000)
List<List<String>> cdList = new ArrayList<List<String>>();
List<String> tempList = new ArrayList<String>();
Integer counter = 0;
for(Integer i = 0; i < subCdList.size(); i++)
tempList.add(subCdList.get(i));
counter++;
if(counter == 1000)
counter = 0;
cdList.add(tempList);
tempList = new ArrayList<String>();
if(tempList.size() > 0)
cdList.add(tempList);
Criterion criterion = null;
//Iterate the list of lists, add the restriction for smaller list
for(List<String> cds : cdList)
if (criterion == null)
criterion = Restrictions.in("subCd", cds);
else
criterion = Restrictions.or(criterion, Restrictions.in("subCd", cds));
criteria.add(criterion);
else
criteria.add(Restrictions.in("subCd", subCdList));
return criteria.list();
这是一个不错的解决方案,因为您将只有一个 select 语句。但是,我认为在 DAO 层上有 for 循环是个坏主意,因为我们不希望连接长时间打开。
解决方案 2: 使用 DetachedCriteria。不要传递列表,而是在 WHERE 子句上查询它。
public List<Something> findSomething()
Criteria criteria = getSession().createCriteria(getEntityClass());
DetachedCriteria detached = DetachedCriteria.forClass(DifferentClass.class);
detached.setProjection(Projections.property("cd"));
criteria.add(Property.forName("subCd").in(detached));
return criteria.list();
此解决方案中的问题在于 DetachedCriteria 的技术使用。当您想要创建对当前类上完全没有连接(或没有关系)的另一个类的查询时,通常会使用它。在示例中,Something.class 有一个属性 subCd,它是来自 DifferentClass 的外键。另一个,这会在 where 子句上产生一个子查询。
查看代码时: 1. SOLUTION 2 更简洁明了。 2. 但是 SOLUTION 1 提供的查询只有一个选择。 请帮我决定哪一个更有效。
谢谢。
【问题讨论】:
请注意,解决方案 1 容易受到查询计划缓存抖动和内存问题的影响(如 @dragan-bozanovic 的回答中所述)。见***.com/questions/31557076/… 【参考方案1】:对于解决方案1: 您可以尝试以下方法,而不是使用for循环
为避免这种情况,如果传递的参数值的大小超过 1000,请使用实用程序方法构建 Criterion Query IN 子句。
class HibernateBuildCriteria
private static final int PARAMETER_LIMIT = 800;
public static Criterion buildInCriterion(String propertyName, List<?> values)
Criterion criterion = null;
int listSize = values.size();
for (int i = 0; i < listSize; i += PARAMETER_LIMIT)
List<?> subList;
if (listSize > i + PARAMETER_LIMIT)
subList = values.subList(i, (i + PARAMETER_LIMIT));
else
subList = values.subList(i, listSize);
if (criterion != null)
criterion = Restrictions.or(criterion, Restrictions.in(propertyName, subList));
else
criterion = Restrictions.in(propertyName, subList);
return criterion;
使用方法:
criteria.add(HibernateBuildCriteria.buildInCriterion(propertyName, list));
希望这会有所帮助。
【讨论】:
您好,很抱歉,我目前无法投票赞成您的回答。我认为您很好地重构了解决方案 1。谢谢! @dionned :当你获得足够的积分时,你可以投票。 :)【参考方案2】:解决方案 1 有一个主要缺点:您最终可能会得到许多不同的准备好的语句,这些语句需要被解析,并且需要计算和缓存执行计划。这个过程可能比实际执行查询的语句已经被数据库缓存的查询要昂贵得多。请参阅此question 了解更多详情。
我解决这个问题的方法是利用 Hibernate 使用的algorithm 批量获取延迟加载的关联实体。基本上,我使用ArrayHelper.getBatchSizes
来获取id 的子列表,然后对每个子列表执行单独的查询。
解决方案 2 仅当您可以在子查询中投影 id 时才适用。但如果你不能,那么你就不能使用它。例如,您的应用程序的用户在屏幕上编辑了 20 个实体,现在他们正在保存更改。您必须通过 id 读取实体以合并更改,并且您不能在子查询中表达它。
但是,解决方案 2 的替代方法可能是使用临时表。例如 Hibernate does it sometimes 用于批量操作。您可以将您的 id 存储在临时表中,然后在子查询中使用它们。与解决方案 1 相比,我个人认为这是一个不必要的复杂性(当然对于这个用例;Hibernate 的推理对其用例有好处),但它是一个有效的替代方案。
【讨论】:
您好,谢谢您的回答。很抱歉,我现在无法投票。 您好,您能否进一步解释一下为什么使用批量提取算法更好?例如,如果我在列表中有 2000 条记录,将其除以 1000 只会产生 2 个子列表。因此我将只有 2 个标准。如果我使用批量提取算法,我将至少输出 9 个子列表,这将导致 9 个 in-criterions。 嗨@dionned,请看我对此question的回答。以上是关于restricted access是啥意思的主要内容,如果未能解决你的问题,请参考以下文章