与此问题相关
前提:
这些是我的假设,根据我的阅读,经验和理解,他们可能是错的,如果他们是,请评论,我会编辑问题.
题:
我有一个不在二级缓存中的对象.由于一些糟糕的编程或其他约束,加载对象的代码在同一个休眠会话中被多次调用.回顾是使用HQL查找查询,例如
hibernateTemplate.find("from Foo f where f.bar > ?", bar);
Run Code Online (Sandbox Code Playgroud)
在添加查询缓存之前,如果上述代码在同一个Hibernate会话中被调用了N次,那么数据库就会有N次命中
然后我想看看如果添加查询缓存会发生什么:
Query query = session.createQuery("from Foo f where f.bar > ?");
query.setCacheable(true);
query.setParameter(bar);
query.list();
Run Code Online (Sandbox Code Playgroud)
当我添加查询缓存时,我注意到在同一个会话期间,hibernate不会再次访问数据库N次,每个会话只有一次.
Foo不在第二级缓存中的object()在数据库中被更改,那么查询缓存(跨会话范围)将返回错误的标识符,从而返回错误的对象.那是对的吗?顺便说一下,在相关问题中声称查询缓存不适用于会话缓存范围.我想知道这个说法或其他什么吗?
我在理解HQL查询从哪里获取信息时遇到了一些麻烦.我的项目使用不同的线程,每个线程读/写数据库.线程不共享Session对象,而是使用HibernateUtil为我创建会话的类.
直到最近,我只会在写完后关闭一个会议,但不会在阅读后关闭.对数据的更改将立即在数据库中看到,但是当读取其他线程(与用于写入的对象不同的Session对象)时,我会得到陈旧的信息.读取和写入总是发生在不同的线程上,这意味着不同的Session对象和不同的会话缓存.
我一直认为通过使用HQL而不是Criteria,我会始终瞄准数据库(或二级缓存)而不是会话缓存,但在调试我的代码时,我清楚地知道HQL正在寻找会话缓存中的对象并检索一个旧的过时的对象.
假设HQL总是以数据库为目标,我错了吗?或者至少是二级缓存?
PS:我只使用一个SessionFactory物体.
如果我在一个线程中多次调用一个查询,我只想为该线程缓存该查询(及其结果)(或者因为我每个线程使用一个会话,因为该会话),该怎么办?我这样做?
注意:我的第二级缓存已打开,但它主要用于session.get(...).但是我不想将它用于我的查询缓存,因为我只需要它在我的线程(/ session)期间存活.
谢谢
所以我有一个不使用数据库的Django项目('DATABASES'设置被注释掉了).我选择使用Django,因为我将来可能需要数据库功能.无论如何,我已经在这个项目上工作了几个月而没有任何问题.我正在运行Linux Mint,python manage.py runserver到目前为止使用该命令并没有遇到麻烦.
好吧,今天我启动了应用程序并启动了本地服务器没有任何问题.然后我尝试在浏览器中打开应用程序并收到相当可怕的错误消息:
Traceback (most recent call last):
File "/home/peter/.virtualenvs/vis_it/lib/python3.3/site-packages/django/contrib/sessions/backends/base.py", line 170, in _get_session
return self._session_cache
AttributeError: 'SessionStore' object has no attribute '_session_cache'
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
File "/home/peter/.virtualenvs/vis_it/lib/python3.3/site-packages/django/core/handlers/base.py", line 87, in get_response
response = middleware_method(request)
File "/home/peter/.virtualenvs/vis_it/lib/python3.3/site-packages/django/contrib/auth/middleware.py", line 34, in process_request
if user and hasattr(user, 'get_session_auth_hash'):
File "/home/peter/.virtualenvs/vis_it/lib/python3.3/site-packages/django/utils/functional.py", line 224, in inner
self._setup()
File "/home/peter/.virtualenvs/vis_it/lib/python3.3/site-packages/django/utils/functional.py", line 357, in _setup
self._wrapped = self._setupfunc()
File "/home/peter/.virtualenvs/vis_it/lib/python3.3/site-packages/django/contrib/auth/middleware.py", line …Run Code Online (Sandbox Code Playgroud)