小编Era*_*dan的帖子

Hibernate查询缓存 - 对于不在二级缓存中的对象 - 有风险吗?有用?不好的做法?

与此问题相关

前提:

这些是我的假设,根据我的阅读,经验和理解,他们可能是错的,如果他们是,请评论,我会编辑问题.

  • 查询缓存主要与二级缓存一起使用
  • 查询缓存缓存查询+参数的标识符结果
  • 如果数据库已更改,则查询缓存存在风险,并且未将其反映到缓存中

题:

我有一个不在二级缓存中的对象.由于一些糟糕的编程或其他约束,加载对象的代码在同一个休眠会话中被多次调用.回顾是使用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次,每个会话只有一次.

  1. 所以我的第一个假设是Hibernate首先在Session Cache中搜索,然后在2nd Level Cache中搜索.这个假设是否正确?
  2. 我还假设如果Foo不在第二级缓存中的object()在数据库中被更改,那么查询缓存(跨会话范围)将返回错误的标识符,从而返回错误的对象.那是对的吗?
  3. 那么,对于包含不可变信息的查询,即使对于非2L缓存对象,使用查询缓存是否安全可行?(例如,其where子句包含将始终返回相同结果的条件的查询,例如,当ser_num和id对在创建后不更改时,"select p.ser_num where p.id =?")

顺便说一下,在相关问题中声称查询缓存不适用于会话缓存范围.我想知道这个说法或其他什么吗?

hibernate second-level-cache session-cache query-cache

10
推荐指数
1
解决办法
6470
查看次数

在调试模式下启动时显示Eclipse无法连接到VM错误

Eclipse正在显示当我在调试模式下打开任何程序时无法连接到VM错误.这是异常堆栈

 java.net.SocketException: socket closed
    at java.net.PlainSocketImpl.socketAccept(Native Method)  //I dont know which socket is closed in my PC
    at java.net.PlainSocketImpl.accept(PlainSocketImpl.java:384)
    at java.net.ServerSocket.implAccept(ServerSocket.java:453)
    at java.net.ServerSocket.accept(ServerSocket.java:421)
    at org.eclipse.jdi.internal.connect.SocketTransportService.accept(SocketTransportService.java:95)
    at org.eclipse.jdi.internal.connect.SocketTransportImpl.accept(SocketTransportImpl.java:56)
    at org.eclipse.jdi.internal.connect.SocketListeningConnectorImpl.accept(SocketListeningConnectorImpl.java:135)
    at org.eclipse.jdt.internal.launching.StandardVMDebugger$ConnectRunnable.run(StandardVMDebugger.java:107)
    at java.lang.Thread.run(Thread.java:619)
Run Code Online (Sandbox Code Playgroud)

即使我的Localhost工作正常,我ping 127.0.01和localhost都工作正常,即使我重新启动我的电脑甚至得到相同的错误.不知道我的PC中关闭了哪个套接字.请帮助我..我正在使用eclipse 8.x.

java

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

是否有一个MV**JavaScript框架,由Play(2.1.x及以上版本)框架(如果有)认可/设计?

我是Play框架的新手,我想知道它是否有任何"伴侣"MV**JavaScript框架.

是否有任何框架(Backbone.js,Angular.js,Knockout.js,Ember.js等)

  • 来自TypeSafe的某种官方认可
  • 玩框架社区代言
  • 播放集成文档/教程
  • 良好的开源Play框架插件

如果没有,是否有任何MV**框架应该避免使用Play的任何特定原因?

playframework-2.0

9
推荐指数
0
解决办法
389
查看次数

如何从命令行将Scala升级到更新版本?

是否可以通过sbt/other命令行工具升级已安装的Scala版本?

我确定有办法,但经过快速搜索我找不到任何东西,我错过了什么吗?

scala sbt

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

这些自执行匿名函数(又名IIFE)实现之间有什么区别

在许多书籍/ 博客文章中,自调用匿名函数模式的方式如下:

(function() {
  var foo = 'bar';
})();
Run Code Online (Sandbox Code Playgroud)

但是,在此上运行JSLint会出现此错误:

将调用移动到包含该函数的parens中.

例如将其改为此作品:

(function() {
  var foo = 'bar';
}());
Run Code Online (Sandbox Code Playgroud)

问题

  1. 为什么第一个实现对JSLint来说不够好?有什么区别?
  2. 什么是首选形式?JSLint总是对的吗?
  3. 它为什么有效?毕竟function(){}()抛出一个SyntaxError: Unexpected token (
    但用parens包裹它会让它突然间起作用吗?eg (function(){}()) - 工作正常
    (毕竟这是JavaScript,而不是Lisp,所以包装parens对ohterwise语法错误的影响是什么?)

编辑:这是对此的一些后续(虽然我不会说完全重复):JSLint错误:"将调用移动到包含该函数的parens",所以我的主要问题是#3,为什么它完全有效?

javascript

9
推荐指数
1
解决办法
610
查看次数

使此可见性示例失败

Java Concurrency in Practice中我认为令人惊讶的一个例子(至少我)是这样的:

public class Foo {

  private int n;

  public Foo(int n) {
    this.n = n;
  }

  public void check() {
    if (n != n) throw new AssertionError("huh?");

  }
}
Run Code Online (Sandbox Code Playgroud)

令我惊讶的是(至少对我来说)声称这不是线程安全的,不仅它不安全,而且检查方法也有可能抛出断言错误.

解释是,如果没有同步/标记n为volatile,则不同线程之间没有可见性保证,并且n的值可以在线程读取时更改.

但我想知道它在实践中发生的可能性有多大.或者更好,如果我能以某种方式复制它.

所以我试图编写会触发断言错误的代码,没有运气.

有没有直接的方法来编写一个测试,证明这个可见性问题不仅仅是理论上的?

或者它是否在最近的JVM中发生了变化?

编辑:相关问题:非线程安全对象发布

java concurrency

9
推荐指数
1
解决办法
105
查看次数

如何在Kotlin中将字符串"前置"为字符串

这可能是那里最新手的Kotlin问题:如何在Kotlin中将Char添加到字符串中?

例如

fun main(args: Array<String>) {
  val char = 'H'
  val string = "ello World"
  val appendingWorks = string + char //but not what I want...
  //val prependingFails = char + string //no .plus(str:String) version
  val prependingWorkaround1 = char.toString() + string
  val prependingWorkaround2 = "" + char + string
  val prependingWorkaround3 = String(charArray(char)) + string

}
Run Code Online (Sandbox Code Playgroud)

当试图在Char上调用+(例如plus)时,没有版本接受右边的String,因此'H' + "ello World"不编译

第一个解决方法可能已经足够好了,但对于我来说,从Java的工作原理来看,这是一个回归:( String test = 'H' + "ello World";编译好...)

我也不喜欢上一个解决方法,至少在java.lang.String我有一个接受单个char的构造函数,或者我可以使用java.lang.Character.toString(char c) …

kotlin

9
推荐指数
1
解决办法
4635
查看次数

Akka的轻量级线程

我最近读到了Quasar,它为JVM提供了"轻量级"/类似Go的"用户模式"线程(它还有一个像Akka一样的Erlang启发的Actor系统,但这不是主要问题)

例如:

package jmodern;

import co.paralleluniverse.fibers.Fiber;
import co.paralleluniverse.strands.Strand;
import co.paralleluniverse.strands.channels.Channel;
import co.paralleluniverse.strands.channels.Channels;

public class Main {
    public static void main(String[] args) throws Exception {
        final Channel<Integer> ch = Channels.newChannel(0);

        new Fiber<Void>(() -> {
            for (int i = 0; i < 10; i++) {
                Strand.sleep(100);
                ch.send(i);
            }
            ch.close();
        }).start();

        new Fiber<Void>(() -> {
            Integer x;
            while((x = ch.receive()) != null)
                System.out.println("--> " + x);
        }).start().join(); // join waits for this fiber to finish
    }
}
Run Code Online (Sandbox Code Playgroud)

据我所知,上面的代码没有产生任何JVM /内核线程,所有这些都是在用户模式线程中完成的(或者他们声称)这应该更便宜(就像我正确理解的Go一样)

我的问题是 - …

java multithreading scala akka quasar

9
推荐指数
1
解决办法
4524
查看次数

Python Minidom - 如何遍历属性,获取其名称和值

我想遍历dom节点的所有属性并获取名称和值

我试过这样的事情(文档对此并不是很冗长,所以我猜了一下):

for attr in element.attributes:
    attrName = attr.name
    attrValue = attr.value
Run Code Online (Sandbox Code Playgroud)
  1. for循环甚至没有启动
  2. 一旦循环工作,如何获取属性的名称和值?

循环错误:

for attr in element.attributes:
  File "C:\Python32\lib\xml\dom\minidom.py", line 553, in __getitem__
    return self._attrs[attname_or_tuple]
 KeyError: 0
Run Code Online (Sandbox Code Playgroud)

我是Python新手,请温柔

python minidom python-3.x

8
推荐指数
1
解决办法
1万
查看次数

在此示例Play框架代码(表单映射)中使用unapply有什么用?

我是Play框架的新手,并且已经过了2.1 样本,在这个computer-database例子中,我发现了以下不完全理解的表单定义.

什么是角色Computer.applyComputer.unapply在这里?

  val computerForm = Form(
    mapping(
      "id" -> ignored(NotAssigned:Pk[Long]),
      "name" -> nonEmptyText,
      "introduced" -> optional(date("yyyy-MM-dd")),
      "discontinued" -> optional(date("yyyy-MM-dd")),
      "company" -> optional(longNumber)
    )(Computer.apply)(Computer.unapply)
  )
Run Code Online (Sandbox Code Playgroud)

(来自controllers/Application.scala)

编辑:这似乎是一个很好的资源:https://groups.google.com/forum/?fromgroups =#!topic/play-framework/dxNQ8E81YJs但仍不确定我完全了解全局.

scala playframework playframework-2.0

8
推荐指数
2
解决办法
2213
查看次数