小编min*_*das的帖子

接口方法中的最终参数 - 重点是什么?

在Java中,final在接口方法中定义参数并且不遵循实现类中的参数是完全合法的,例如:

public interface Foo {
    public void foo(int bar, final int baz);
}

public class FooImpl implements Foo {

    @Override
    public void foo(final int bar, int baz) {
        ...
    }
}
Run Code Online (Sandbox Code Playgroud)

在上面的例子中,bar并且在类VS的接口中baz有相反的final定义.

以同样的方式,final当一个类方法扩展另一个类时,不会强制执行任何限制abstract.

虽然final在类方法体内有一些实用价值,但是有没有指定final接口方法参数的点?

java methods final interface class

185
推荐指数
4
解决办法
3万
查看次数

告诉IntelliJ IDEA哪些方法不能识别为未使用

IntelliJ IDEA有一个方便的功能来检测未使用的方法并以灰色显示它们,暗示了对死代码的潜在警告.

但是,某些方法不是直接执行,而是通过反射执行.一个很好的例子@RequestMapping是由Spring执行的注释方法.IntelliJ有很好的Spring集成,因此它检测到这个注释,并没有将这样的方法标记为未使用.

我有一个小的AJAX框架,我使用自己的注释来指出基于某些HTTP请求属性执行哪个方法(非常类似于@RequestMapping正在做的).可以理解的是,IntelliJ不知道我的注释代表什么,并且将这种方法标记为未使用,增加了不必要的噪声.

我在考虑:

  • 用另一个注释注释我的注释,但有没有任何标准的注释可以毫不费力地完成工作?
  • 在IntelliJ中查找特定设置以识别用于标记方法的自定义注释,但这需要其他团队成员执行相同操作,基本上是一种痛苦.

任何人都可以提出任何想法如何解决这个问题?

java aop spring annotations intellij-idea

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

为en-US和en_US创建区域设置有什么区别?

我在表中拥有所有的resourcebundle值,并根据要求进行格式化.我必须根据页面顶部的下拉列表中的用户选择更改网站中的语言.如果我使用语言代码作为en_US,那么它的工作正常.如果我使用en-Us作为语言代码,那么它不起作用.可能是什么问题.哪个是正确的?

java internationalization

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

Surefire没有接受Junit 4测试

出于某种原因,我无法获得Maven 2 Surefire插件来执行JUnit 4测试类.

public class SimpleTest {
  @org.junit.Test
  public void simple() {
     System.out.println("foo");
  }
}
Run Code Online (Sandbox Code Playgroud)

但是,如果我将此类更改为JUnit-3,例如

public class SimpleTest extends junit.framework.TestCase {
  public void testBar() {
     System.out.println("bar");
  }

  @org.junit.Test
  public void simple() {
     System.out.println("foo");
  }
}
Run Code Online (Sandbox Code Playgroud)

然后它被执行.这就是我所做的:

  • 已验证的Maven版本:Apache Maven 2.2.1(r801777; 2009-08-06 20:16:01 + 0100)
  • 经过验证的Surefire版本:遵循建议
  • 经过验证的Surefire版本:检查了我的Surefire罐子~/.m2/repository/org/apache/maven/surefire- 所有这些都是版本2.4.2或2.4.3
  • 做了一个mvn dependency:tree | grep junit以确保我只依赖junit 4.7版

我遇到此问题的模块没有JUnit 3测试.

还有什么我想念的吗?

java maven-2 surefire maven

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

在大事务中安全地清除Hibernate会话

我使用Spring + Hibernate进行操作,需要创建和更新数十万个项目.像这样的东西:

{
   ...
   Foo foo = fooDAO.get(...);
   for (int i=0; i<500000; i++) {
      Bar bar = barDAO.load(i);
      if (bar.needsModification() && foo.foo()) {
         bar.setWhatever("new whatever");
         barDAO.update(bar);
         // commit here
         Baz baz = new Baz();
         bazDAO.create(baz);
         // if (i % 100 == 0), clear
      }
   }
}
Run Code Online (Sandbox Code Playgroud)

为了保护自己不要丢失中间的变化,我会在以下情况后立即提交更改barDAO.update(bar):

HibernateTransactionManager transactionManager = ...; // injected by Spring
DefaultTransactionDefinition def = new DefaultTransactionDefinition();
def.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRED);
TransactionStatus transactionStatus = transactionManager.getTransaction(def);
transactionManager.commit(transactionStatus);
Run Code Online (Sandbox Code Playgroud)

此时我不得不说整个进程在包含的事务中运行org.springframework.orm.hibernate3.support.ExtendedOpenSessionInViewFilter(是的,这是一个webapp).

这一切都运行良好,但有一个例外:在几千次更新/提交之后,整个过程变得非常慢,很可能是由于内存因Spring/Hibernate保留的不断增加的对象而膨胀.

在仅限Hibernate的环境中,通过调用可以轻松解决这个问题org.hibernate.Session#clear().

现在,问题:

  • 什么时候到了clear()?它的性能成本是否很高? …

java orm spring hibernate

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

更改spring Web应用程序的默认会话超时

我必须测试一个由spring和jsp编写的Web应用程序.应用程序的默认会话超时为30分钟.

我想减少会话超时.为此,我在web.xml文件中进行了更改tomcatInstallationLocation/conf/.但它不起作用.默认配置tomcatInstallationLocation/conf/web.xml是 -

<session-config>
    <session-timeout>30</session-timeout>
</session-config>
Run Code Online (Sandbox Code Playgroud)

我刚刚改变时间并做到了 -

<session-config>
    <session-timeout>5</session-timeout>
</session-config>
Run Code Online (Sandbox Code Playgroud)

但仍然不起作用.据我所知,在这种情况下,我必须改变我的弹簧应用程序web.xml.但我不确定.谁能帮我?

提前致谢.

java spring tomcat session-timeout

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

Servlet 3规范和ThreadLocal

据我所知,Servlet 3规范引入了异步处理功能.除此之外,这意味着可以并且将重用相同的线程来处理另一个并发的HTTP请求.这不是革命性的,至少对于之前与NIO合作的人来说至少是这样.

无论如何,这导致另一个重要的事情:没有ThreadLocal变量作为请求数据的临时存储.因为如果同一个线程突然成为另一个HTTP请求的运营商线程,请求本地数据将暴露给另一个请求.

所有这些都是基于阅读文章的纯粹推测,我没有时间玩任何Servlet 3实现(Tomcat 7,GlassFish 3.0.X等).

所以,问题:

  • 我是否正确地认为ThreadLocal将不再是一个方便的黑客来保存请求数据?
  • 有没有人玩过任何Servlet 3实现并尝试使用ThreadLocals来证明上述内容?
  • 除了在HTTP Session中存储数据之外,还有其他类似的易于访问的黑客你可能会建议吗?

编辑:别误会我的意思.我完全理解危险并ThreadLocal成为黑客.事实上,我总是建议不要在类似的环境中使用它.但是,不管你信不信,线程上下文的使用频率比你想象的要频繁得多.一个很好的例子是Spring的OpenSessionInViewFilter,根据它的Javadoc:

此过滤器通过当前线程使Hibernate会话可用,该线程将由事务管理器自动检测.

这不是严格的ThreadLocal(没有检查来源),但已经听起来令人震惊.我可以想到更多类似的场景,而且丰富的Web框架使得这种情况更有可能发生.

简而言之,许多人在这个黑客的基础上建造了他们的沙堡,无论是否有意识.因此,斯蒂芬的答案是可以理解的,但并不完全是我所追求的.我想得到一个确认是否有人真正尝试能够重现失败的行为,所以这个问题可以作为被同一问题困扰的其他人的参考点.

java multithreading servlets thread-local servlet-3.0

27
推荐指数
2
解决办法
6618
查看次数

按类型划分的弹簧布线比按名称布线要慢

在我的项目中,我正在尝试迁移所有用法

Foo foo = (Foo) beanFactory.getBean("name");
Run Code Online (Sandbox Code Playgroud)

Foo foo = beanFactory.getBean(Foo.class);
Run Code Online (Sandbox Code Playgroud)

好处是显而易见的:类型安全性,较少复杂的代码,较少的无用常量等.通常,这些线路位于静态遗留环境中,其中这种布线是唯一的选择.

这一切都很好,直到有一天用户开始抱怨来自Spring internals的缓慢.所以我启动了一个分析器来找到一个热点

org.springframework.beans.factory.support.AbstractBeanFactory::doGetBean(String, Class<T>, Object[], boolean)

这是一个昂贵的电话

Class.isAssignableFrom(anotherClass).

我已经快速创建了一个小的性能测试,以找出字符串名称和类型查找之间的速度差异是一个百日咳350次(我正在使用StaticApplicationContext这个测试FAIW)!

在调查这一点时,我发现SPR-6870的票数很高,但由于某种原因没有得到解决.这导致我试图解决这个问题,这个问题确实显着改善了这种情况,但仍然比String查找慢了~25倍!事实证明,这种尝试只解决了一半的问题:它缓存了bean的名称以保存在O(n)迭代上,但仍然需要调用isAssignableFrom来验证类型.

所描述的问题不仅与我的场景有关,而且也适用@Autowired于在循环内创建bean的情况下使用并且可能感觉很难的bean.

其中一个解决方案是覆盖其中一个bean工厂方法并缓存同一类型的is-this-bean类型的检查结果,但显然这应该在Spring中完成而不是在我自己的代码中完成.

是否还有其他人遇到类似问题并找到解决方案?

java performance spring dependency-injection autowired

24
推荐指数
1
解决办法
3048
查看次数

选择分布式共享内存解决方案

我有一项任务是为大规模可扩展的分布式共享内存(DSM)应用程序构建原型.原型只能作为概念验证,但我希望通过选择稍后将在真实解决方案中使用的组件来最有效地利用我的时间.

此解决方案的目的是从外部源获取数据输入,流失它并使结果可用于许多前端.那些"前端"只会从缓存中获取数据并在没有额外处理的情况下提供服务.这些数据的前端命中量实际上可以达到每秒数百万.

数据本身非常不稳定; 它可以(而且确实)变化很快.然而,在最新的处理和缓存之前,前端应该看到"旧"数据.处理和写入由单个(冗余)节点完成,而其他节点仅读取数据.换句话说:没有直读行为.

我正在寻找像memcached这样的解决方案,但是这个特殊的解决方案并不能满足我们下面列出的所有要求:

  1. 该解决方案至少必须具有相当好的维护的Java客户端API,因为其余的应用程序是用Java编写的,我们是经验丰富的Java开发人员;
  2. 解决方案必须是完全弹性的:应该可以添加新节点而无需重新启动集群中的其他节点;
  3. 解决方案必须能够处理故障转移.是的,我意识到这意味着一些开销,但整体服务的数据大小并不大(最大1G),所以这应该不是问题."故障转移"是指在节点出现故障时无需硬编码/更改服务器IP地址(如memcached客户端)的无缝执行;
  4. 理想情况下,应该可以指定数据重叠的程度(例如,应该在DSM集群中存储多少份相同数据的副本);
  5. 不需要永久存储所有数据,但可能需要对某些数据进行后处理(例如,序列化到数据库).
  6. 价格.显然我们更喜欢免费/开源,但如果解决方案值得,我们很乐意支付合理的金额.无论如何,支付24小时/天的支持合同是必须的.
  7. 整个事情必须在我们的数据中心托管,因此像Amazon SimpleDB这样的SaaS产品超出了范围.如果没有其他选择,我们只考虑这个.
  8. 理想情况下,解决方案将严格一致(如CAP); 但是,最终的一致性可以被视为一种选择.

提前感谢任何想法.

java architecture distributed-caching nosql

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

Hibernate Criteria API中Restrictions.like和.ilike之间的区别

Hibernate的CriteriaAPI具有Restrictions.ilike以下合同的功能:

不区分大小写的"喜欢",类似于Postgres ilike运算符

这很酷.但是同一个班级也有like功能,合同含义要多得多:

对命名属性应用"like"约束

Criteria cr = session.createCriteria(Employee.class);

// To get records having fistName starting with zara
cr.add(Restrictions.like("firstName", "zara%"));

// Case sensitive form of the above restriction.
cr.add(Restrictions.ilike("firstName", "zara%"));
Run Code Online (Sandbox Code Playgroud)

java sql hibernate database-agnostic

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