我正在使用ProcessBuilder在Java中构建一个进程,如下所示:
ProcessBuilder pb = new ProcessBuilder()
.command("somecommand", "arg1", "arg2")
.redirectErrorStream(true);
Process p = pb.start();
InputStream stdOut = p.getInputStream();
Run Code Online (Sandbox Code Playgroud)
现在我的问题如下:我想捕获通过该进程的stdout和/或stderr的任何内容,并将其重定向到System.out
异步.我希望进程及其输出重定向在后台运行.到目前为止,我发现这样做的唯一方法是手动生成一个新的线程,该线程将连续读取stdOut
,然后调用适当的write()
方法System.out
.
new Thread(new Runnable(){
public void run(){
byte[] buffer = new byte[8192];
int len = -1;
while((len = stdOut.read(buffer)) > 0){
System.out.write(buffer, 0, len);
}
}
}).start();
Run Code Online (Sandbox Code Playgroud)
虽然这种方法很有效,但感觉有点脏.最重要的是,它为我提供了一个正确管理和终止的线程.有没有更好的方法来做到这一点?
很多人都在谈论String.intern()的性能优势,但实际上我对性能损失可能更感兴趣.
我主要担心的是:
我关注所有这些事情,因为我目前正在对使用具有复制,因为字符串太多内存的问题,一个金融应用程序.某些字符串基本上看起来像枚举值,并且只能存在数量有限的潜在值(例如货币名称("USD","EUR"))超过一百万份.在这种情况下,String.intern()似乎是不费吹灰之力,但我担心每次在某处存储货币时调用intern()的同步开销.
最重要的是,一些其他类型的字符串可以具有数百万个不同的值,但每个字符串仍然有数万个副本(例如ISIN代码).对于这些,我担心实习百万串基本上会减慢实习生()方法这么多,以拖垮我的应用程序.
我正在开发一个Java Web应用程序,它通过从Web服务加载的大型XML配置文件来实现它的行为.由于在访问应用程序的特定部分之前实际上不需要这些文件,因此它们会被懒惰地加载.当需要其中一个文件时,会向Web服务发送查询以检索相应的文件.由于某些配置文件可能会被大量使用,更经常比别人我想建立某种形式的缓存(有可能1个小时的过期时间),以避免一遍又一遍请求相同的文件.
对于所有会话中的所有用户,Web服务返回的文件都是相同的.我不使用JSP,JSF或任何其他花哨的框架,只是简单的servlet.
我的问题是,在Java Web应用程序中实现这样一个全局静态缓存的最佳实践是什么?单例类是否合适,或者由于J2EE容器会有奇怪的行为吗?我应该通过JNDI在某处暴露某些东西吗?我该怎么做才能使我的缓存不会在集群环境中搞砸(每个集群服务器有一个缓存可以,但不是必需的)?
鉴于上面的信息,将一个负责缓存的对象作为ServletContext属性是否是正确的实现?
注意:我不想在启动时加载所有这些并完成它因为那样
1).每当我的应用程序启动时重载webservice
2).我的应用程序运行时文件可能会更改,所以无论如何我都要重新查询它们
3).我仍然需要一个全局可访问的缓存,所以我的问题仍然存在
更新:使用缓存代理(例如squid)可能是一个好主意,但是对webservice的每个请求都会在post Data中发送相当大的XML查询,每次都可能不同.只有Web应用程序才真正知道对Web服务的两个不同调用实际上是等效的.
谢谢你的帮助
以下位代码无法在gcc 4.5.3上编译
struct Frobnigator
{
template<typename T>
void foo();
template<typename T>
void bar();
};
template<typename T>
void Frobnigator::bar()
{
}
template<typename T>
void Frobnigator::foo()
{
bar<T>();
}
template<> // error
void Frobnigator::foo<bool>()
{
bar<bool>();
}
template<>
void Frobnigator::bar<bool>()
{
}
int main()
{
}
Run Code Online (Sandbox Code Playgroud)
错误讯息:specialization of ‘void Frobnigator::bar() [with T = bool]’ after instantiation
.我终于解决了这个问题,因为Frobnigator::bar<bool>()
之前出现了专门化Frobnigator::foo<bool>()
.显然,方法看起来很重要.
那么为什么以上是上面代码的lite版本,其中bar
泛型版本之后出现的特化,有效吗?
struct Frobnigator
{
template<typename T>
void foo();
};
template<typename T>
void Frobnigator::bar()
{
}
template<>
void Frobnigator::bar<bool>() …
Run Code Online (Sandbox Code Playgroud) 我正在编写一个需要通过webservice登录的java Web应用程序.当然,我使用的应用程序服务器(glassfish v2)提供的领域都不能解决问题.因此,我必须自己写.但是,我写的领域实现似乎完全依赖于glassfish,不能像任何其他应用程序服务器那样使用.
是否有任何标准或广泛支持的方式来实现自定义Realm?是以任何方式从.war部署该领域,还是总是需要从服务器自己的类路径加载?
我想知道是否有任何方法可以确定给定java.lang.Method
对象所代表的方法是否会覆盖另一个对象所代表的另一种方法java.lang.Method
?
我正在研究Stronlgy类型的javascript,我需要能够知道一个方法是否覆盖了另一个方法,以便能够将它们重命名为更短的名称.
在这种情况下,我正在讨论覆盖的扩展定义,如@Override
注释所支持,其中包括接口和抽象类方法的实现.
我对任何涉及直接反射或使用已经执行此操作的库的解决方案感到满意.
我一直在尝试从Oracle OCI驱动程序切换到瘦驱动程序,我tnsnames.ora
通过添加-Doracle.net.tns_admin=/path
到命令行获得了瘦驱动程序来拾取我的驱动程序.
但是,我们tnsnames.ora
包含一次定义多个服务的行.它们看起来像这样:
NEWS2,NEWS,NEWSFX = (DESCRIPTION_LIST=...)
Run Code Online (Sandbox Code Playgroud)
OCI驱动程序似乎对这种格式感到满意,但瘦驱动程序并不了解那些是3个单独的服务NEWS2
,NEWS
并且NEWSFX
.一些痛苦的调试会话显示,它认为这是一个名为的单一服务NEWS2,NEWS,NEWSFX
.
可以理解,我们的DBA不太热衷于左右复制粘贴服务描述符,并且坚持认为我们找到了一种方法,可以在从OCI切换到精简之前为没有复制粘贴的同一服务描述符声明不同的名称.
使用oracle瘦驱动程序是否有正确支持的方法来实现这一目标?
PS:这是一个使用相同功能的人的帖子,并且还提到它显然没有文档:https://dbamarco.wordpress.com/2015/12/02/tnsnames-ora-secrets/
我目前正在开发一个基于JavaEE的大型软件.我们遵循JavaEE的一般准则,即每个相关的操作集应该进入他们自己的EJB.我们目前有超过275种不同的EJB类(无状态会话bean).这个数字最有可能增长到这个数字的至少两倍.
我想知道EJB容器是否设计用于容纳许多不同类型的EJB.我很想知道我们是否会因为有太多这样的类而导致一些不良的性能损失,并且如果某些应用程序服务器级别调整可以帮助减轻这些假设性问题.
我们在sun的Java 6上使用Glassfish v2和JavaEE 5,因此对此特定平台的建议将非常感激.
作为一名程序员,我经常会看一下我目前正在使用的语言的一些功能,并自己思考"这对于程序员来说很难做到,并且可以由机器自动处理".
这种特征的一个例子是存储器管理,它在各种语言中已经自动化了一段时间.虽然大多数时候内存管理并不难以手动完成,但在不泄漏内存的情况下在应用程序中完美地完成它非常困难.自动化使其变得简单,以便我们的程序员可以专注于更关键的问题.
是否有任何您认为编程语言应该自动化的功能,因为奖励/难度比率太低(例如并发)?
这个问题旨在成为关于编程未来的头脑风暴,以及我们可以让我们专注于更重要的任务的语言,所以即使您认为自动化不实用,也请发表您的意愿/可行.好的答案将指出在许多语言中真正难以做到的事情,而不是单一语言的宠儿.
language-agnostic theory language-features programming-languages
我有这个查询,balances
如果表中不存在相应的行,则尝试向表中添加行totals
.使用PostgreSQL上的默认隔离级别在事务中运行查询.
INSERT INTO balances (account_id, currency, amount)
SELECT t.account_id, t.currency, 0
FROM balances AS b
RIGHT OUTER JOIN totals USING (account_id, currency) AS t
WHERE b.id IS NULL
Run Code Online (Sandbox Code Playgroud)
我有一个UNIQUE
约束balances (accountId, currency)
.我担心如果多个会话同时执行此查询,我将陷入竞争状态,导致重复键错误.我已经看过很多关于这个问题的问题,但它们似乎都涉及子查询,多个查询或pgSQL函数.
由于我没有在我的查询中使用任何这些,它是否没有竞争条件?如果不是我该如何解决?
java ×5
java-ee ×3
c++ ×1
caching ×1
ejb ×1
glassfish ×1
inheritance ×1
jaas ×1
jaspic ×1
jdbc ×1
ojdbc ×1
oracle ×1
overriding ×1
performance ×1
postgresql ×1
reflection ×1
servlets ×1
sql ×1
string ×1
templates ×1
theory ×1