标签: database-caching

我怎么知道准备好的语句是否被缓存了?

我将Hikari与SQL Server 2016和tomcat lib文件夹中的sqljdbc4-2.0.jar一起使用。

我对数据库资源的配置如下:

<Resource name="jdbc/SQLServerDS" auth="Container" type="javax.sql.DataSource"
              username="uname"
              password="pwd"
              driverClassName="com.microsoft.sqlserver.jdbc.SQLServerDriver"
              url="jdbc:sqlserver://server:port;DatabaseName=dbName"
              maxActive="20"
              maxIdle="10"
              validationQuery="select 1" />
Run Code Online (Sandbox Code Playgroud)

我的数据源配置如下:

@Bean(name = "dataSource")
    public DataSource getDataSource() throws NamingException {
        HikariConfig config = new HikariConfig();
        config.setMaximumPoolSize(20);
        config.setDataSourceJNDI("java:comp/env/jdbc/SQLServerDS");
        config.addDataSourceProperty("cachePrepStmts", "true");
        config.addDataSourceProperty("prepStmtCacheSize", "250");
        config.addDataSourceProperty("prepStmtCacheSqlLimit", "2048");
        config.addDataSourceProperty("useServerPrepStmts", "true");
        config.addDataSourceProperty("cacheResultSetMetadata", "true");
        config.addDataSourceProperty("useLocalSessionState", "true");
        config.addDataSourceProperty("cacheServerConfiguration", "true");
        config.addDataSourceProperty("elideSetAutoCommits", "true");
        config.addDataSourceProperty("maintainTimeStats", "false");
        return new TransactionAwareDataSourceProxy(
                new LazyConnectionDataSourceProxy(new HikariDataSource(config)));
    }
Run Code Online (Sandbox Code Playgroud)

我如何知道preparestatement缓存是否适用于不同的连接?

我正在将Spring容器管理的事务与hibernate v4.3.10.Final一起使用。

另外,为了使缓存起作用,是否需要启用二级缓存?

java spring hibernate database-caching hikaricp

7
推荐指数
1
解决办法
203
查看次数

SQL查询在C++应用程序中最小化/缓存

我正在用C++/Qt编写一个项目,它能够连接到QtSQL支持的任何类型的SQL数据库(http://doc.qt.nokia.com/latest/qtsql.html).这包括本地服务器和外部服务器.

但是,当有问题的数据库是外部的时,查询的速度开始成为一个问题(慢UI,...).原因是:存储在数据库中的每个对象都是延迟加载的,因此每次需要属性时都会发出查询.平均大约20个这些对象将显示在屏幕上,每个对象显示约5个属性.这意味着对于我显示的每个屏幕,大约有100个查询被执行.查询在数据库服务器本身上执行得非常快,但是通过网络运行的实际查询的开销很大(整个屏幕以秒为单位).

我一直在考虑解决问题的几种方法,最重要的方法似乎是(据我所知):

  1. 减少查询次数
  2. 更快地进行查询

解决(1)

  • 我可以找到某种方法来延迟实际获取属性(启动事务),然后当程序员写入endTransaction()时,数据库会尝试一次性获取所有内容(使用SQL UNION或循环...) .这可能需要相当多的修改懒惰对象工作,但这样的,如果人们评论说,这是一个不错的解决方案,我认为这可能是优雅的制定.如果这个解决方案加速了一切,那么甚至可能不需要精心设计的缓存方案,从而节省了很多麻烦
  • 我可以尝试通过在一个查询中为所有请求的对象提取属性数据来预加载属性数据,从而有效地使它们变得非惰性.当然,在这种情况下,我将不得不担心过时的数据.如何在不向外部数据库发送一个查询的情况下检测过时数据?(注意:发送查询以检查每个属性检查的陈旧数据将提供最佳情况下的0x性能增加,并且当实际发现数据过时时,最差等级2x性能下降)

应对(2)

例如,通过保持数据库的本地同步副本运行,可以使查询更快.但是,我在客户端计算机上运行的可能性并不大,例如与服务器上的数据库类型完全相同.因此,本地副本例如是SQLite数据库.这也意味着我无法使用特定于数据库供应商的解决方案.我有什么选择?什么在这种情况下对人们有效?

我主要担心的是:

  • 陈旧的数据:目前有大量的查询可以想象,改变分贝,因为它禁止这似乎可能与陈旧数据的用户的操作的方式.
  • 可维护性:我可以在这个新层中融合多少?显然,如果它不必了解我的内部惰性对象系统以及每个对象和可能的查询的所有内容,那将是更可取的

最后的问题

什么是最小化查询成本的好方法?良好的意义某种组合:可维护,易于实现,而不是特定的aplication.如果它选择任何2,那么就这样吧.我想听听人们谈论他们的经历以及他们为解决这些问题所做的工作.

正如你所看到的,我已经想到了一些问题和处理它的方法,但是我不知道什么才是合理的方法.由于很可能涉及很多工作并且对程序中的许多层进行了密集的更改(希望尽可能少),我想在此之前向所有专家询问,然后再就此事做出最终决定.我也可以忽略一个非常简单的解决方案,在这种情况下,指向它的指针将非常感激!

假设所有相关的服务器端调优都已完成(例如:MySQL缓存,最佳索引,......)

*注意:我已经检查过类似问题但没有完全满足我的问题的用户的问题:对我的用例的复制方案的建议?本地数据库缓存的最佳实践?例如)

如果需要任何其他信息来提供答案,请告诉我,我会及时更新我的​​问题.对于任何拼写/语法错误道歉,英语不是我的母语.

关于"懒惰"的说明

我的代码看起来像的一个小例子(当然简化):

QList<MyObject> myObjects = database->getObjects(20, 40); // fetch and construct object 20 to 40 from the db

// ...some time later

// screen filling time!
foreach (const MyObject& …
Run Code Online (Sandbox Code Playgroud)

c++ sql qt lazy-evaluation database-caching

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

具有codeigniter问题的数据库缓存

我刚刚使用codeigniter和mysql构建了一个站点.它工作得很好,但我想打开数据库缓存.我想我会全局地做,而不是手动缓存每个select语句.在我的数据库配置文件中,我设置'cache_on'= TRUE然后为'cachedir' = "http://www.mydomain.com/application/cache/dbcache"

我将整个缓存目录设置为可写,因此我认为所有内容都已正确设置.加载几页后,我回头看了一下缓存目录,它仍然是空的.我假设这意味着没有任何缓存.我错过了什么吗?我没有收到任何错误,我的所有选择语句都显示结果.我做错了什么/如何判断缓存是否有效?

谢谢!

php sql caching codeigniter database-caching

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