我想问一下什么是多线程Java应用程序的最佳解决方案,以确保所有线程同步访问db.例如,每个线程代表单独的事务,并首先检查db的值,然后根据答案必须插入或更新数据库中的某些字段(注意,插入和提交应用程序之间的注意事项正在进行其他处理).但问题是另一个线程可能在同一个表上做同样的事情.更具体的例子.线程T1启动事务,然后检查表ENTITY_TABLE是否输入代码为'111'如果发现更新其日期,如果未找到则插入新条目,然后提交事务.现在假设线程T2完全相同.现在几乎没有问题:1.T1和T2检查db并找不到任何内容并且都插入相同的条目.2. T1检查db,查找具有旧日期的条目,但在提交T2时已经更新了最近日期的条目.3.如果我们使用缓存并同步访问缓存,则会出现问题:T1获取锁定检查db和缓存,如果未找到则添加到缓存,释放锁定,提交.T2做同样的事情,发现缓存中的条目将提交.但T1事务失败并被支持.现在T2形状不好,因为它应该插入ENTITY_TABLE但不知道.还有更多?
我正在努力创建简单的自定义缓存,同步和解决问题3.但我感兴趣的是,有一些更简单的解决方案吗?有没有人必须解决类似的问题?你是怎么做到的?
ScheduledExecutorService如果之前的任务尚未完成,我有兴趣使用为任务生成多个线程.例如,我需要每0.5秒处理一个文件.第一个任务开始处理文件,0.5秒后如果第一个线程没有完成第二个线程产生并开始处理第二个文件,依此类推.这可以通过以下方式完成:
ScheduledExecutorService executor = Executors.newScheduledThreadPool(4)
while (!executor.isShutdown()) {
executor.execute(task);
try {
Thread.sleep(500);
} catch (InterruptedException e) {
// handle
}
}
Run Code Online (Sandbox Code Playgroud)
现在我的问题:为什么我不能这样做executor.scheduleAtFixedRate?
我得到的是,如果第一个任务需要更长时间,第二个任务会在第一个任务完成后立即启动,但即使执行程序具有线程池,也不会启动新线程.executor.scheduleWithFixedDelay很清楚 - 它在它们之间执行具有相同时间跨度的任务,并且完成任务所需的时间并不重要.所以我可能误解了ScheduledExecutorService目的.
也许我应该看看另一种执行者?或者只使用我在这里发布的代码?有什么想法吗?
我在想如何通过jndi节省查找远程ejb参考的时间.我有一个需要快速工作的应用程序,但它也必须调用远程ejb,这会减慢它的速度.
所以我的解决方案是这样的:我使用apache commons-pool库并将其StackObjectPool实现用于我的远程ejb引用缓存.
private static final ObjectPool pool = new StackObjectPool(new RemoteEjbFactory());
Run Code Online (Sandbox Code Playgroud)
工厂看起来像这样:
public static class RemoteEjbFactory extends BasePoolableObjectFactory {
@Override
public Object makeObject() {
try {
return ServiceLocator.lookup(jndi);
} catch (NamingException e) {
throw new ConfigurationException("Could not find remote ejb by given name", e);
}
}
}
Run Code Online (Sandbox Code Playgroud)
然后我通过从池中借用它来获取对象(如果池中没有自由对象它使用工厂创建一个):
SomeEjbRemote someEjb = null;
try {
someEjb = (SomeEjbRemoteImpl) pool.borrowObject();
someEjb.invokeRemoteMethod();
} catch (Throwable t) {
if (someEjb != null) {
pool.invalidateObject(someEjb);
}
pool.clear(); // Maybe its not neccessary
someEjb = …Run Code Online (Sandbox Code Playgroud) 我想处理数据中的NA值,但不想缩放和居中,因此我只需要这样做:
preProcess(data, method = "knnImpute", k=10)
Run Code Online (Sandbox Code Playgroud)
或这个:
preProcess(data, method = "bagImpute")
Run Code Online (Sandbox Code Playgroud)
但是,它会自动缩放和集中似乎有意的数据(在文档中说明)。我该如何避免这种情况,而只是插补?
可以说我有这样的data.frame
df <- data.frame(signal = c(0, 0, 1, 0, 1, 1, 0, 1, 1, 1))
Run Code Online (Sandbox Code Playgroud)
什么是通过连续n次的数字信号找到第一个信号的最佳方法.例如,如果n = 1,那么我的信号将是第三个元素,我想得到这样的答案:
c(0, 0, 1, 0, 0, 0, 0, 0, 0, 0)
Run Code Online (Sandbox Code Playgroud)
对于n = 2,答案是:
c(0, 0, 0, 0, 0, 1, 0, 0, 0, 0)
Run Code Online (Sandbox Code Playgroud)
并且对于n = 3,最后一个元素是连续3个之后的信号:
c(0, 0, 0, 0, 0, 0, 0, 0, 0, 1)
Run Code Online (Sandbox Code Playgroud) 我知道通常注入器应该在所有应用程序中仅使用一次(在启动时)。但我有以下用例。我为 Executor 注入任务实现,然后在该任务中我有FileHandler每次都必须实例化的依赖项(可以说)。我知道方法是注入提供程序(可以说FileHandlerProvider),每次请求时都会返回新实例。问题是FileHandler它自己有很多依赖项(可以说Parser,OutputPrinter......)。现在,这些每次也需要新的实例(因为实现可能有一些状态,例如计数器,并且在下一个线程运行时重用同一实例将是一个问题)。问题是,注入提供程序后,会重用提供程序的相同实例,因此FileHandler总是使用 sameParser和创建 new OuputPrinter。解决方案可能是再次注入ParserProvider andOutputPrinterProvider而不是 Parser 和OuputPrinterin FileHandlerProvider,但这是不对的,它很快就会变得太复杂,因为有更多的依赖项。我现在看到的唯一简单的解决方案可能是使用 Injector in FileHandlerProvider,它将返回新实例FileHandler(以及依赖项的新实例)。或者在这种情况下也许还有另一种更优雅的解决方案?
嗨,我正在使用 DDPRateLimiter 限制meteor.js 中的一些方法的速率,我发现它限制了每个人的方法调用,而不仅仅是那个连接!例如对于这个规则:
var updateUsernameRule = {
type: 'method',
name: 'updateUsername'
};
DDPRateLimiter.addRule(updateUsernameRule, 1, 30000);
Run Code Online (Sandbox Code Playgroud)
在一个浏览器中更新,然后在另一个浏览器中更新时会导致速率限制错误。文档对此有点不清楚,默认行为根本不直观。我如何限制每个用户的速率?
我找不到关于如何在 quantmod 图表中突出显示单个蜡烛的任何信息。这是一个示例代码:
library(quantmod)
getSymbols("AAPL", src="yahoo")
chart_Series(AAPL, subset="2007-01")
AAPL$show <- ifelse(as.Date(index(AAPL)) == as.Date("2007-01-09"), 1, 0)
add_TA(AAPL$show, col="red")
Run Code Online (Sandbox Code Playgroud)
我想做的是以某种方式突出显示 2007-01-09 上的那个栏。它可能是不同的蜡烛颜色、围绕它的矩形或不同的背景颜色。任何想法如何做到这一点?