小编And*_*708的帖子

动态查询优化

我有一项业务任务,基本上只是从数据库中提取数据(Microsoft SQL Server 2008).在此过程中,用户将能够选择要选择的列,选择要从中选择的视图,以及构建WHERE子句.根据用户选择的内容,相应地构造SQL查询.要求是用户可以从任何视图中选择任何列,并按WHERE子句中的ANY列进行过滤.该公司不希望该解决方案使用数据仓库/ OLAP,并希望限制任何第三方软件.所以基本上他们只需要一个.NET Windows Forms应用程序,它基于GUI动态构建SQL查询并连接到数据库.

我关心的是如何优化查询.我还不擅长优化SQL查询,但我首先想到的是:如果用户选择过滤没有索引的列(在WHERE子句中)会怎么样?通过为用户提供如此大的灵活性,他们可能构建无效的查询,以至于需要很长时间才能执行.

我意识到如果对没有索引的列进行过滤,那么对于大量数据来说,性能永远不会好,但是我能做些什么来改进它?当然,我不能只为所有列添加索引.

我不一定只是寻找查询优化,但我也在考虑是否有任何服务器调整,我可以做,如缓存?基本上我都是耳朵,并寻找任何可以帮助我提高性能的建议.

有什么建议?

先感谢您!

database sql-server indexing optimization performance

6
推荐指数
1
解决办法
3303
查看次数

C++条件包含文件运行时

我正在开发一个用C++编码的游戏,我希望能够在运行时更改语言.目前,语言是在编译时通过包含头文件(具有语言定义)来选择的,如下所示:

#include "lan_eng.h"
Run Code Online (Sandbox Code Playgroud)

因此,一旦编译了客户端,游戏就不允许更改语言.我的问题是,是否有一种方法可以在运行时有条件地包含文件?我是C++的新手,所以起初我以为我可以这样做:

#define DEF_LANGUAGE_ENG
//#define DEF_LANGUAGE_DEN

#ifdef DEF_LANGUAGE_ENG

    #include "lan_eng.h"

#endif

#ifdef DEF_LANGUAGE_DEN

    #include "lan_den.h"

#endif
Run Code Online (Sandbox Code Playgroud)

当然这使得维护更容易,但问题是我相信它只能在编译时工作.我希望能够将所选语言存储在变量中(在运行时更改),然后使用该变量来选择要包含的头文件.有没有办法用头文件来做这个,还是我会被迫上课?

我希望这不是一个愚蠢的问题; 我的搜索没有给我我希望的结果.

提前致谢!

c++ include

5
推荐指数
1
解决办法
6159
查看次数

过滤与Doctrine 2中的条件对象关联

假设我有一个与实体Profile有关联的Account实体.我想,以获取配置文件profileCode = 12345 ,并在那里其相关Account拥有的E-mail地址my@email.com.所以,我需要在两个实体上指定一个条件.

为此我创建了一个自定义存储库Repository\Profile,现在我想知道如何实现它.我知道我可以使用"原始"DQL查询或使用查询构建器来解决所有这些问题.但是,我觉得它不像我想的那样漂亮,因为它非常接近原始SQL.当然语法有点不同,但从概念上讲,我会在SQL方面考虑更多,而不是OOP.我会做很多这样的事情,所以我真的想以最好的方式去做.

我已经对Criteria对象做了一些阅读(文档稀疏),只要我在单个实体上进行过滤,它看起来真的很棒.Criteria在关联实体上进行过滤时,我无法找到任何解决方案.

所以基本上我的问题是:有没有什么方法可以Criteria直接从数据库和自定义存储库中使用对象来过滤多个实体?我真的更喜欢在自定义存储库中编码,而不是实体本身,就像我看到的一些人那样.这是可能的,还是有任何好的选择,或者是普通的DQL还是查询构建器真的要走的路?

php doctrine doctrine-orm

5
推荐指数
1
解决办法
3282
查看次数

过滤与Doctrine2的多对多关联

我有一个拥有Account实体集合的Section实体.每个Section实体都有一个实体集合Element(OneToMany关联).我的问题是,我想获取属于某个部分与特定帐户相关联的所有元素,而不是获取属于某个部分的所有元素.下面是我的数据库模型.

数据库模型

因此,当我获取一个帐户时,我希望能够遍历其关联的部分(这部分没有问题),并且对于每个部分,我想循环遍历与获取的帐户关联的元素.现在我有以下代码.

$repository = $this->objectManager->getRepository('MyModule\Entity\Account');
$account = $repository->find(1);

foreach ($account->getSections() as $section) {
    foreach ($section->getElements() as $element) {
        echo $element->getName() . PHP_EOL;
    }
}
Run Code Online (Sandbox Code Playgroud)

问题是它获取属于给定部分的所有元素,无论它们与哪个帐户相关联.生成的用于获取节的元素的SQL如下所示.

SELECT t0.id AS id1, t0.name AS name2, t0.section_id AS section_id3
FROM mydb.element t0
WHERE t0.section_id = ?
Run Code Online (Sandbox Code Playgroud)

我需要它做的事情如下(可能是任何其他方法).使用SQL完成过滤非常重要.

SELECT e.id, e.name, e.section_id
FROM element AS e
INNER JOIN account_element AS ae ON (ae.element_id = e.id)
WHERE ae.account_id = ?
AND e.section_id = ?
Run Code Online (Sandbox Code Playgroud)

我知道我可以getElementsBySection($accountId) …

php orm doctrine-orm

5
推荐指数
1
解决办法
2389
查看次数

Spring MVC + Hibernate:无法初始化代理 - 没有Session

注意:请参阅我自己对此问题的回答,以获取我如何解决此问题的示例.

我在Spring MVC 4 + Hibernate 4项目中遇到以下异常:

org.hibernate.LazyInitializationException:懒得初始化一个角色集合:com.mysite.Company.acknowledgements,无法初始化代理 - 没有Session

在阅读了很多关于这个问题的其他问题后,我理解为什么会发生这种异常,但我不确定如何以一种好的方式解决它.我正在做以下事情:

  1. 我的Spring MVC控制器调用服务中的方法
  2. service方法调用DAO类中的方法
  3. DAO类中的方法通过Hibernate获取实体对象并将其返回给调用服务
  4. 该服务将获取的对象返回给控制器
  5. 控制器将对象传递给视图(JSP)
  6. 该视图尝试迭代一个懒惰加载的多对多关联(因此是一个代理对象)
  7. 抛出异常是因为此时会话已关闭,并且代理无法加载关联数据

我之前使用过PHP和doctrine2,这种做事方式没有问题.我试图找出解决这个问题的最佳方法,因为到目前为止我找到的解决方案看起来并不那么好:

  • 急切加载关联,可能会加载大量不必要的数据
  • 调用Hibernate.initialize(myObject.getAssociation());- 这意味着我必须遍历关联来初始化它们(我猜),而且事实上我必须这样做,有点使得延迟加载不那么整洁
  • 使用Spring过滤器在视图中打开会话,但我怀疑这是一件好事吗?

我试着@Transactional在我的服务中使用,但没有运气.这是有道理的,因为我试图访问我的服务方法返回尚未加载的数据.理想情况下,我希望能够从我的视图中访问任何关联.我想在我的服务中初始化关联的缺点是我必须明确定义我需要的数据 - 但这取决于使用服务的上下文(控制器).我不确定我是否可以在我的控制器中执行此操作而不会丢失DBAL层提供的抽象.我希望这是有道理的.无论哪种方式,如果我不必总是明确定义我想要哪些数据可用于我的视图,那就太好了,但只是让视图做它的事情.如果那是不可能的,那么我只是在寻找最优雅的解决方案.

以下是我的代码.

视图

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>

<h1><c:out value="${company.name}" /> (ID: <c:out value="${company.id}" />)</h1>

<c:forEach var="acknowledgement" items="${company.acknowledgements}">
    <p><c:out value="${acknowledgement.name}" /></p>
</c:forEach>
Run Code Online (Sandbox Code Playgroud)

调节器

@Controller
public class ProfileController {
    @Autowired
    private CompanyService companyService;

    @RequestMapping("/profile/view/{id}")
    public String view(Model model, @PathVariable int id) {
        Company …
Run Code Online (Sandbox Code Playgroud)

spring hibernate spring-mvc

5
推荐指数
2
解决办法
2万
查看次数

使用JPQL和Hibernate嵌套提取连接

我正在编写一个JPQL查询(使用Hibernate作为我的JPA提供程序)来获取实体Company及其几个关联.这适用于我的"简单"ManyToMany关联,如下所示:

@Entity
@Table(name = "company")
@NamedQueries({
        @NamedQuery(
                name = "Company.profile.view.byId",
                query = "SELECT c " +
                        "FROM Company AS c " +
                        "INNER JOIN FETCH c.city AS city " + <-- @ManyToOne
                        "LEFT JOIN FETCH c.acknowledgements " + <-- @ManyToMany
                        "LEFT JOIN FETCH c.industries " + <-- @ManyToMany
                        "WHERE c.id = :companyId"
        )
})
public class Company { ... }
Run Code Online (Sandbox Code Playgroud)

Hibernate创建一个查询来获取上面的内容,这很好.然而,我的Company实体也有存储在中间表数据的许多一对多的关联,因此,这是为什么映射为@OneToMany@ManyToOne三个实体之间的关联.

公司< - CompanyService - > Service

这些是我的代码中的三个实体.因此,Company实例具有一组CompanyService实体,每个实体都与 …

java hibernate jpa jpql

5
推荐指数
1
解决办法
5474
查看次数

在 Spring 框架中使用 SPeL 读取系统属性

我需要在我的配置文件之一中获取以下系统属性:-Dspring.profiles.active="development". 现在我看到无数人建议这可以用 Spring 表达式语言来完成,但我无法让它工作。这是我尝试过的(加上许多变体)。

@Configuration
@ComponentScan(basePackages = { ... })
public class AppConfig {
    @Autowired
    private Environment environment;

    @Value("${spring.profiles.active}")
    private String activeProfileOne;

    @Value("#{systemProperties['spring.profiles.active']}")
    private String activeProfileTwo;

    @Bean
    public PropertySourcesPlaceholderConfigurer propertyPlaceholderConfigurer() {
        Resource[] resources = {
            new ClassPathResource("application.properties"),
            new ClassPathResource("database.properties")

            // I want to use the active profile in the above file names
        };

        PropertySourcesPlaceholderConfigurer propertySourcesPlaceholderConfigurer = new PropertySourcesPlaceholderConfigurer();
        propertySourcesPlaceholderConfigurer.setLocations(resources);
        propertySourcesPlaceholderConfigurer.setIgnoreUnresolvablePlaceholders(true);

        return propertySourcesPlaceholderConfigurer;
    }
}
Run Code Online (Sandbox Code Playgroud)

所有的属性都是NULL. 如果我尝试访问任何其他系统属性,也会发生同样的情况。我可以通过调用毫无问题地访问它们System.getProperty("spring.profiles.active"),但这不太好。

我发现的许多示例都将其配置PropertySourcesPlaceholderConfigurer为也搜索系统属性,所以也许这就是它不起作用的原因。但是,这些示例在 Spring 3 和 XML 配置中,设置了类中不再存在的属性。也许我必须调用该 …

java spring spring-mvc spring-el

5
推荐指数
1
解决办法
4382
查看次数

使用Java从外部库修改文件

我有一个使用Maven解决依赖关系的Spring Framework项目。该项目依赖于另一个Spring项目(Spring Social Facebook),该项目用于Facebook登录。突然,我开始收到很多错误,因为Facebook登录功能由于Facebook API的更改而中断。该解决方案非常简单,但是需要在外部库的文件中进行较小的更改-将变量从整数类型更改为long类型。

现在我知道了解决方案,但是我无法控制该库。我想自己修复此问题,直到用该修复程序更新该库为止,而不是等系统损坏后再等待几天。

我的问题是:在库本身有可用的修复程序之前,有什么简便的方法可以更改此库的源代码?建议这样做的方法是什么?当前想到两件事:分叉库,进行更改以及创建私有Maven存储库,并将依赖项替换为使用私有存储库的依赖项。如果可以的话,我想避免这种情况。我可以想到的另一种方法是,将库派生,进行更改,将更新的库编译为jar文件并替换Maven依赖项以使用jar文件。

有没有更好的办法?在这种(临时)方案中,您会推荐什么?谢谢!

java spring maven spring-social-facebook

5
推荐指数
1
解决办法
934
查看次数

在webpack中使用ExtractTextPlugin忽略Angular2组件样式表

我使用html-webpack-plugin插件将<script>标签注入到webpack生成的块的模板文件中.我还有一些全局样式表,我想动态添加到<head>我的HTML模板部分.为此,我也使用html-webpack-plugin如下(app在这种情况下,entry/chunk是相关的).

module.exports = {
    entry: {
        'polyfills': './ts/polyfills.ts',
        'vendor': './ts/vendor.ts',
        'app': './ts/app.ts'
    },

    module: {
        loaders: [
            {
                test: /\.ts$/,
                loaders: ['ts', 'angular2-template-loader']
            },
            {
                test: /\.html$/,
                loader: 'html-loader'
            },
            {
                test: /\.css$/,
                loaders: ['to-string-loader', ExtractTextPlugin.extract('style-loader', 'css-loader')]
            }
        ]
    },

    plugins: [
        new ExtractTextPlugin('css/[name].[contenthash].css'),

        new webpack.ProvidePlugin({
            bootstrap: 'bootstrap'
        }),

        new webpack.optimize.CommonsChunkPlugin({
            name: 'app',
            filename: 'js/[name].[chunkhash].min.js',
            chunks: ['app']
        }),

        new webpack.optimize.CommonsChunkPlugin({
            name: 'vendor',
            filename: 'js/[name].[chunkhash].min.js',
            chunks: ['vendor']
        }),

        new webpack.optimize.CommonsChunkPlugin({
            name: 'polyfills',
            filename: …
Run Code Online (Sandbox Code Playgroud)

webpack angular

5
推荐指数
1
解决办法
1835
查看次数

无法通过 AWS Cognito API 重新发送验证码

我有一个 AWS Cognito 用户池,其中用户是使用AdminCreateUser操作通过 Cognito 的 API 创建的,它工作正常。这会向用户发送一封验证电子邮件,其中包含一个临时密码。到现在为止还挺好。

现在用户没有收到此验证电子邮件,因此我需要使用ResendConfirmationCode操作再次发送它。我试图用下面的 PHP 代码来做到这一点。

$userPoolId = '[POOL_ID_HERE]';
$backendAppId = '[APP_ID_HERE]';
$clientSecret = '[SECRET_HERE]';
$username = '[UUID_HERE]';

$secretHash = base64_encode(hash_hmac('sha256', $username . $backendAppId, $clientSecret, true));

$cognitoIdp->resendConfirmationCode([
    'ClientId' => $backendAppId,
    'SecretHash' => $secretHash,
    'Username' => $username,
]);
Run Code Online (Sandbox Code Playgroud)

这给了我以下错误:

Aws/CognitoIdentityProvider/Exception/CognitoIdentityProviderException 带有消息“在“ https://cognito-idp.eu-central-1.amazonaws.com ”上执行“ResendConfirmationCode”时出错;AWS HTTP 错误:客户端错误:POST https://cognito-idp.eu-central-1.amazonaws.com 导致400 Bad Request响应:{"__type":"NotAuthorizedException","message":"无法为此用户重新发送确认代码"} NotAuthorizedException(客户端):无法为此重新发送确认代码用户 - {"__type":"NotAuthorizedException","message":"无法为该用户重新发送确认码"}'

我正在使用对用户池具有以下 IAM 权限的用户的凭据:

  • cognito-idp:AdminDeleteUser
  • cognito-idp:AdminCreateUser
  • cognito-idp:AdminAddUserToGroup
  • cognito-idp:ResendConfirmationCode

如果我使用IAM Policy Simulator测试权限,它会给我绿灯,说一切正常。据我所知,cognito-idp:ResendConfirmationCode操作应该足够了,因为在创建用户时发送验证电子邮件工作正常。

我在这里做错了什么?另一种方法是再次调用 AdminCreateUser 操作,将 …

amazon-web-services amazon-cognito

4
推荐指数
1
解决办法
5698
查看次数