在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
接口方法参数的点?
IntelliJ IDEA有一个方便的功能来检测未使用的方法并以灰色显示它们,暗示了对死代码的潜在警告.
但是,某些方法不是直接执行,而是通过反射执行.一个很好的例子@RequestMapping
是由Spring执行的注释方法.IntelliJ有很好的Spring集成,因此它检测到这个注释,并没有将这样的方法标记为未使用.
我有一个小的AJAX框架,我使用自己的注释来指出基于某些HTTP请求属性执行哪个方法(非常类似于@RequestMapping
正在做的).可以理解的是,IntelliJ不知道我的注释代表什么,并且将这种方法标记为未使用,增加了不必要的噪声.
我在考虑:
任何人都可以提出任何想法如何解决这个问题?
我在表中拥有所有的resourcebundle值,并根据要求进行格式化.我必须根据页面顶部的下拉列表中的用户选择更改网站中的语言.如果我使用语言代码作为en_US,那么它的工作正常.如果我使用en-Us作为语言代码,那么它不起作用.可能是什么问题.哪个是正确的?
出于某种原因,我无法获得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)
然后它被执行.这就是我所做的:
~/.m2/repository/org/apache/maven/surefire
- 所有这些都是版本2.4.2或2.4.3mvn dependency:tree | grep junit
以确保我只依赖junit 4.7版我遇到此问题的模块没有JUnit 3测试.
还有什么我想念的吗?
我使用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()
?它的性能成本是否很高? …我必须测试一个由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
.但我不确定.谁能帮我?
提前致谢.
据我所知,Servlet 3规范引入了异步处理功能.除此之外,这意味着可以并且将重用相同的线程来处理另一个并发的HTTP请求.这不是革命性的,至少对于之前与NIO合作的人来说至少是这样.
无论如何,这导致另一个重要的事情:没有ThreadLocal
变量作为请求数据的临时存储.因为如果同一个线程突然成为另一个HTTP请求的运营商线程,请求本地数据将暴露给另一个请求.
所有这些都是基于阅读文章的纯粹推测,我没有时间玩任何Servlet 3实现(Tomcat 7,GlassFish 3.0.X等).
所以,问题:
ThreadLocal
将不再是一个方便的黑客来保存请求数据?ThreadLocal
s来证明上述内容?编辑:别误会我的意思.我完全理解危险并ThreadLocal
成为黑客.事实上,我总是建议不要在类似的环境中使用它.但是,不管你信不信,线程上下文的使用频率比你想象的要频繁得多.一个很好的例子是Spring的OpenSessionInViewFilter
,根据它的Javadoc:
此过滤器通过当前线程使Hibernate会话可用,该线程将由事务管理器自动检测.
这不是严格的ThreadLocal
(没有检查来源),但已经听起来令人震惊.我可以想到更多类似的场景,而且丰富的Web框架使得这种情况更有可能发生.
简而言之,许多人在这个黑客的基础上建造了他们的沙堡,无论是否有意识.因此,斯蒂芬的答案是可以理解的,但并不完全是我所追求的.我想得到一个确认是否有人真正尝试并能够重现失败的行为,所以这个问题可以作为被同一问题困扰的其他人的参考点.
在我的项目中,我正在尝试迁移所有用法
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中完成而不是在我自己的代码中完成.
是否还有其他人遇到类似问题并找到解决方案?
我有一项任务是为大规模可扩展的分布式共享内存(DSM)应用程序构建原型.原型只能作为概念验证,但我希望通过选择稍后将在真实解决方案中使用的组件来最有效地利用我的时间.
此解决方案的目的是从外部源获取数据输入,流失它并使结果可用于许多前端.那些"前端"只会从缓存中获取数据并在没有额外处理的情况下提供服务.这些数据的前端命中量实际上可以达到每秒数百万.
数据本身非常不稳定; 它可以(而且确实)变化很快.然而,在最新的处理和缓存之前,前端应该看到"旧"数据.处理和写入由单个(冗余)节点完成,而其他节点仅读取数据.换句话说:没有直读行为.
我正在寻找像memcached这样的解决方案,但是这个特殊的解决方案并不能满足我们下面列出的所有要求:
提前感谢任何想法.
Hibernate的Criteria
API具有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 ×10
spring ×4
hibernate ×2
annotations ×1
aop ×1
architecture ×1
autowired ×1
class ×1
final ×1
interface ×1
maven ×1
maven-2 ×1
methods ×1
nosql ×1
orm ×1
performance ×1
servlet-3.0 ×1
servlets ×1
sql ×1
surefire ×1
thread-local ×1
tomcat ×1