我正致力于使用Spring 3和Hibernate 3.6开发Web应用程序.目前我试图了解如何使用Spring和Hibernate进行缓存.我找到了一些关于使用Hibernate缓存的消息来源以及一些关于Spring的消息,我现在尝试将我的信息结合在一起.我仍然对这两个框架都有一些问题,如果有人能够回答它们或告诉我这里列出的事实是否正确,我会很高兴.
大多数时候,简短的答案(是/否)就足够了.我认为这个列表对其他人也很有用,他们想要了解spring和hibernate的缓存是如何工作的.
General
1) Hibernate支持以下缓存:第一级缓存,第二级缓存,查询缓存
2) Spring本身支持以下缓存可能性:只是方法缓存
1st Level Cache
3)第一级缓存是每个Hibernate应用程序的一部分.
4)为每个休眠会话创建第一级缓存.
5)第一级缓存中保存了什么?对象或只是其属性的值?查询及其结果?
2nd Level Cache
6)我发现:每个应用程序使用ONCE二级缓存.那不是假的吗?是不是每次sessionfactory使用ONCE?和:多个sessionfactorys =多个第二级缓存可能吗?
7)在二级缓存中保存的内容:在我看来,只是属于一条记录的值,而不是对象本身.
8)当存储来自二级缓存中的一个记录的值时,它是否可以存储相关值(来自通过外键连接的对象)?
9)更新二级缓存中一个对象的值时,是否可以更新缓存中与其连接的对象的值?
10)当一个对象的值发生变化时,如何更新二级缓存?冲洗?我可以只更新缓存的一部分,还是必须更新整个缓存?
11)二级缓存在哪里有意义,哪里不存在?
12)缓存模式:每个缓存模式都提供不同的缓存策略吗?例如,对于缓存模式"只读",不需要同步数据库和缓存吗?其他缓存模式是否提供同步?我认为同步必须由开发者自己完成?
SessionFactory
13)查询缓存和二级缓存有什么区别?在我看来:在查询缓存中,结果集被保存,但没有使用它们的值,只有它们的ID.当再次使用查询并且结果集仍然"正确"时,将从二级缓存中查询属于id的值
14)对于查询缓存,必须使用二级缓存?
15)查询缓存哪里有意义,哪里不存在?
Query Cache
16) Spring是否提供了比方法缓存更多的缓存可能性?
17)方法缓存没有与hibernate缓存相关联
18)但是:对于方法缓存,第二级是必要的,比如ehcache(也可以被hibernate使用)
19)可以在没有数据库查询的情况下使用方法缓存吗?
Spring
20)如果使用ehcache作为二级缓存的hibernate和用于方法缓存的spring的ehcache,我可以使用相同的ehcache-instance吗?是否有可能混淆了什么?
21)当使用第一级缓存和第二级缓存时,它们会混淆吗?在查询数据库时,结果来自哪里,第一级或第二级缓存?第一级缓存是否与二级缓存一起使用?
22)其他任何可以通过使用我提到的缓存混淆的东西?:-)
谢谢你的回答,不管是什么问题!:-)
我使用ExecutorServicefrom Java来协调Threads.用于启动我使用的线程
pool = new ExecutorService(2);
callableResults = pool.invokeAll(threads);
Run Code Online (Sandbox Code Playgroud)
为了收集结果,我使用future.get()每个线程."threads"是实现Callable和覆盖的类中的对象列表call().
现在我遇到了以下问题.该方法call()确实抛出了各种特定的异常.invokeAll()并且future.get()只投掷InterruptedException.
我在哪里可以捕获我投入的具体例外情况call()?或者我必须在那里处理它们?如果抛出其中一个异常,那么结果是InterruptedException?
我有一个包含各种成员变量的类.有一个构造函数,有getter方法,但没有setter方法.实际上,这个对象应该是不可变的.
public class Example {
private ArrayList<String> list;
}
Run Code Online (Sandbox Code Playgroud)
现在我注意到以下内容:当我使用getter-method获取变量列表时,我可以添加新值等等 - 我可以更改ArrayList.当我下次get()为此变量调用时,将ArrayList返回更改的变量.怎么会这样?我没有再设置它,我只是努力了!有了String这种行为是不可能的.那么这里的区别是什么?
我是grails(1.3.7)的新手,我试图让某些东西起作用:
在我的控制器中,我回放了一些我希望在gsp中访问的列表.访问作品,但我只想访问它们,如果它们不是空的.检查列表是否为空不起作用.
这是我的控制器回馈的内容:
return new ModelAndView("/questions/questions", [ questionsList101 : allQuestions101, questionsList102 : allQuestions102, ... ])
allQuestions-objects是包含Questions-Objects(Database-Object)的"def allQuestions .."
在我的gsp上,我尝试以下方法:
<g:if test="${!empty questionsList101}"> 101:<br/>
<g:each in="${questionsList101}" var="elem" status="i">
<g:checkBox name="${questionsList101[i].id}" value="${questionsList101[i].id}"/>${questionsList101[i].id}<br/>
</g:each>
<br/>
</g:if>
Run Code Online (Sandbox Code Playgroud)
循环正在工作,空虚的检查不是.我尝试了"不空","!空",......不知道什么是错的!任何帮助是apreciated!:-)
我有一个简单的问题.通常我会编写如下代码:
String myString = "hello";
for (int i=0, i<10; i++)
{
myString = "hello again";
}
Run Code Online (Sandbox Code Playgroud)
因为我认为以下不是好的风格,因为它会创建太多不必要的对象.
for (int i=0, i<10; i++)
{
String myString = "hello again";
}
Run Code Online (Sandbox Code Playgroud)
这甚至是正确的吗?或者这就是我有一个像我创建的类中的对象这样的显式对象的情况?如果是boolean或int怎么办?什么是更好的编码风格?在循环之前实例化它一次并在循环中使用它或者每次在循环中实例化它?为什么?因为程序更快或更少使用存储或...?
有人告诉我,如果它是一个布尔值,我应该直接在循环中实例化它.他说这对堆没有影响,而且变量属于循环内部会更清楚.什么是正确的?
谢谢你的回答!:-)
====
谢谢你的所有答案!
总之:最好在尽可能小的范围内声明一个对象.通过声明和实例化循环外的对象没有性能改进,即使在每个循环中对象都被重新实例化.
我有一个问题.当我尝试将"相同"对象两次添加到ArrayList时会发生什么."相同"是指单个类的对象,使用equals()和hashCode()标识为相同.它对于大多数成员变量具有不同的值,并且可能是从不同的线程创建的,但对于equals()和hashCode(),它们是"相同的".第二个对象是否会替换第一个对象?
另外,如果两个线程试图将这些对象完全同时添加到ArrayList会发生什么?这甚至可能吗?如果是,会发生什么?
谢谢!:-)
[编辑]感谢所有的答案!我应该使用synchronizedList,而不是使用"synchronize(list){}"吗? - >我读了docs,即使是使用synchronizedList,也可以使用迭代同步(list)
[EDIT2] synchronizedList可以声明为成员变量吗?我试过了,但它没有用.
这可能是一个愚蠢的问题,但我不知道它的答案,我不知道在哪里搜索答案,所以如果有人可以帮助我会很好.
我有一个类(让我们命名为A)具有不同的成员和方法.我在另一个类中使用此类的方法(让我们将其命名为B).
对于创建的每个B-Object,我想使用A的SAME实例.这可能吗?实际上我在B中有一个构造函数,我称之为A a = new A(); 当然,我总是得到这个类的不同实例.
我现在该怎么改变这个?我知道可以用spring框架解决它(将相同的对象注入到B的实例中),但我无法使用它.怎么还能解决这个问题?
非常感谢您的帮助!:-)
我正致力于使用Spring 3和Hibernate 3.6开发Web应用程序.我对@TransactionalAnnotation和代码的结构有一些问题.
- >当我使用@Transactional(使用Spring进行事务管理)时,我是否必须@Transactional在调用它们时使用try/catch 包围注释方法?
例如,当我得到一个加载,更改并返回一个对象的方法然后我从另一个类调用它时:我是否必须使用try/catch包围调用?也许出了点问题,没有返回任何对象,数据库连接失败..我不知道.
到目前为止,我认为会@Transactional关注所有可能发生的异常,并在发生错误时回滚此事务中的每个操作.但如果它发生,我必须以某种方式通知用户.当我在try-block中调用transactional-method并回滚它时,catch块被激活了?我可以告诉用户"出了问题".否则用户可能不会被告知?
或者是否足以检查是否有返回的对象(如果/ else),那么我不需要try/catch?我是新的,我想听听其他结构如何编码.谢谢 :-)
我正在使用Hibernate 3.6,直到今天我找不到使用它的任何缺点.但今天有人告诉我,当项目变大时,使用Hibernate的应用程序会出现内存问题.这会发生,因为与不使用hibernate的应用程序相比,会有很多对象(hibernate-pojo-objects)需要创建和存储.
那是对的吗?还有使用休眠的缺点吗?有些人还告诉我,由于对象之间的所有依赖关系,当数据库真的很大时,使用对象会变得混乱,但我无法想象它.这有什么经验吗?
谢谢 :-)
我是Grails的新手,我试着了解它是如何工作的.我做了一些教程并编写了一个带有mysql数据库连接的示例应用程序.我有三个表,因此有三个域类和三个控制器使用def scaffold = true.因此视图会自动生成.现在我可以添加和删除...表格中的数据.多数民众赞成工作
但现在我不知道该怎么做.我的意思是,创建这些表并填充它们很不错,这很快就可以实现,但是......现在我真的想要开发一个应用程序!通常我使用Spring Framework,Spring Security,Spring MVC等来生成Web应用程序.在那里,一切都是合乎逻辑 我有请求进入,映射到控制器,处理请求的类,给出的答案,jsps呈现....逻辑!
在Grails中,我甚至不知道从哪里开始真正的应用程序!我找到的所有教程都显示相同:设置这些表并能够填充它们,很好,很好 - 但之后呢?
我在哪里保存"main.gsp".我需要一个控制器吗?启动时的应用程序如何重定向到"main.gsp".
我在哪里可以定义"真实的逻辑" - 我想开发类似"具有多个答案的问题 - 尝试选择正确的答案" - 应用程序.好吧,我必须承认,我真的不知道从哪里开始.我没有看到控制器的使用以及在我的应用程序中向表中添加数据的可能性.这是管理员而不是用户.
任何人都可以给我一个提示如何继续吗?或许有人知道一个很好的教程,不是关于"设置域类,带脚手架的控制器,向数据库添加数据" - 我没有看到这么多意义.
谢谢你的帮助!:-)
[编辑]感谢您的回答!服务,这正是我想要的.我想我必须更加熟悉它.这些教程让我感到困惑,但现在我明白了!