小编Gan*_*alf的帖子

生产者/消费者模型是否与演员相等?

最近我一直在阅读很多关于并发编程如何变得困难的文章,以及如何使用共享状态进行并发编程几乎是不可能的.因此,像Erlang这样的语言(我认为这是开启的,如果不是问题仍然有意义)使用Actor模型进行并发,并且在线程之间没有共享状态.现在,在编写并发系统的时候,我并没有发现并发性很难 - 但总的来说,我几乎可以将任何问题都纳入生产者/消费者范例,并且没有太多(如果有的话)共享状态.虽然这是正确的吗?线程之间的消息队列是否实际上是共享状态?或者并发编程的生产者/消费者模型真的是Actor模型的具体示例(这是我真正的问题).思考?

concurrency multithreading producer-consumer actor

7
推荐指数
1
解决办法
933
查看次数

更好的Java方法语法?回来早还是晚?

重复: 函数是否只有一个return语句?

通常情况下,您可能会有一个检查众多条件并返回状态的方法(现在就说布尔值).最好定义一个标志,在方法中设置它,并在结尾返回它:

boolean validate(DomainObject o) {
  boolean valid = false;
  if (o.property == x) {
     valid = true;
  } else if (o.property2 == y) {
     valid = true;
  } ...
  return valid; 
}
Run Code Online (Sandbox Code Playgroud)

或者,一旦你知道方法的结果,简单地返回会更好/更正确吗?

boolean validate(DomainObject o) {

  if (o.property == x) {
     return true;
  } else if (o.property2 == y) {
     return true;
  } ...
  return false; 
}
Run Code Online (Sandbox Code Playgroud)

现在显然可能有try/catch块和所有其他类型的条件,但我认为这个概念很清楚.意见?

java coding-style return-path

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

Ehcache - 在数据不存在时使用SelfPopulatingCache

我正在使用EhCache的装饰器SelfPopulatingCache,当缓存尝试加载新条目时出现问题,但它不存在(即它在数据库中不存在).因此缓存会将一个null值放入缓存中,以取消阻止密钥上的任何其他获取,但是下一个线程将执行相同的数据库调用,因为它从缓存中收到"null".这意味着它认为需要加载条目 - 即使实际上它是空的,因为数据不存在于任何地方.我觉得我做错了什么.

(伪代码)

Value v = cache.get(key); // multiple threads will block here
if (v == null)
   cache.put(key, getValueFromDB()); // this might put a null value
Run Code Online (Sandbox Code Playgroud)

我目前的解决方案是不放空,而是放置占位符Object并检查它.

Value v = cache.get(key);
if (v == null)
   cache.put(key, getValueFromDB());
else if (v == NOENTRYOBJECT)
   return null;
else
   return v;
Run Code Online (Sandbox Code Playgroud)

思考?

java ehcache

6
推荐指数
1
解决办法
3710
查看次数

Spring Boot - 在部署时启动后台线程的最佳方法

我在Tomcat 8中部署了一个Spring Boot应用程序.当应用程序启动时,我想在Spring Autowires的后台启动一个工作线程,并带有一些依赖关系.目前我有这个:

@SpringBootApplication
@EnableAutoConfiguration
@ComponentScan
public class MyServer extends SpringBootServletInitializer {   

    public static void main(String[] args) {
        log.info("Starting application");
        ApplicationContext ctx = SpringApplication.run(MyServer.class, args);
        Thread subscriber = new Thread(ctx.getBean(EventSubscriber.class));
        log.info("Starting Subscriber Thread");
        subscriber.start();
    }
Run Code Online (Sandbox Code Playgroud)

在我的Docker测试环境中,这很好用 - 但是当我将它部署到Tomcat 8中的Linux(Debian Jessie,Java 8)主机时,我从未看到"Starting Subscriber Thread"消息(并且线程未启动).

java spring tomcat spring-boot

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

ResultSet和Select*Performance

我正在重构一些Spring JDBC代码,其中一些成本较高的查询执行"SELECT*FROM ..." - 并且即将开始检查实际需要哪些列,而只是SELECT x,y FROM ..它们.但通过ResultSet类读取似乎大多数数据都是延迟加载的.当您执行ResultSet.next()时,它会移动数据库中的游标(此应用程序中的Oracle 10g),当您执行ResultSet.getXX()时,它会检索该列.所以我的想法是,如果你做一个"SELECT*"但只检索你想要的列,你并没有真正受到性能影响.我正确地考虑了这个吗?我能想到的唯一可以解决这个问题的地方是数据库,因为它将查询结果存储在内存中并且必须使用更多内存,如果只选择了几行,那么它实际上只会存储指向那些击中查询的列甚至不是这种情况.

思考?

注意:这仅适用于标准ResultSet,我知道CachedResultSet的行为不同.

java oracle spring jdbc resultset

5
推荐指数
2
解决办法
3090
查看次数

Oracle Blobs - 商店大小还是计算?

我正在编写一个通用的Http资源托管服务,并将更大的对象作为BLOB存储在Oracle数据库中.我希望能够在返回存储对象时设置'Content-Length'标头,这意味着我需要在开始将其写入客户端之前知道BLOB的大小(我知道我可以使用chunked-encoding,并且我在某些情况下).有没有人有任何关于调用dbms_lob.getlength()在每次读取时都会遇到的性能影响的经验,还是应该在INSERT上计算BLOB大小并将其存储在表中?平均而言,我希望写入速率高于读取速率.我现在正在写一个基准试图看看它的影响是什么,但我认为有人可能已经想到这个问题似乎是一个常见的问题.另外,使用JDBC/Spring 3,我怎么能在写入时计算BLOB大小?(我不能使用触发器或存储过程)谢谢.

java oracle spring jdbc

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

HTTP响应412 - 您可以包含内容吗?

我正在构建RESTful数据存储并利用条件GET和PUT.在条件PUT期间,客户端可以在资源上包含来自先前GET的Etag,并且如果当前表示与服务器不匹配,则将返回HTTP状态代码412(前提条件失败).请注意,这是一个基于Atom的服务器/协议.

我的问题是,当我返回412状态时,我是否还可以包含资源的新表示形式,还是用户必须发出新的GET?HTTP规范似乎没有说是或否,Atom规范也没有(尽管它们的示例在响应中显示了一个空的实体主体).如果不返回新的表示并使客户端专门获取它,这似乎是非常浪费的.思考?

rest http http-status-code-412 atom-feed

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

Spring Profiles应用程序属性顺序

我们有许多具有多个活动Spring配置文件的环境,但application- {profile} .yml文件的优先级是什么?

如果我有 spring.profiles.active=test-us-west-2-p1, test-us-west-2, test

以什么顺序application-test.yml, application-test-us-west-2.yml, application-test-us-west-2-p1.yml加载文件?如果我在每个文件中都有相同的属性,哪个"获胜"?

此外,这是从Spring-Boot 1.5.x更改为2.x吗?好像它可能有.

spring properties spring-boot

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

Oracle - 连接池与spring框架

我们正在尝试在Spring Framework的帮助下实现Oracle连接池.我们正在使用DBCP连接池方法.然而,DBCP和spring之间的集成并没有那么好.

我们面临的问题是DBCP返回PoolableConnections对象,而Oracle期望OracleConnection对象.(引发ClassCastException)

似乎已在Oracle 11g中处理此问题.但是我很好奇其他人如何使用Spring 10 for Oracle 10g(使用TOMCAT)实现Oracle连接池.

我们使用Ibatis作为ORM框架.

我相信有办法.任何帮助表示赞赏.

java spring tomcat ibatis oracle10g

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

重用Runnable的最佳方法

我有一个实现的类,Runnable目前正在使用Executor作为我的线程池来运行任务(将文档索引到Lucene).

executor.execute(new LuceneDocIndexer(doc, writer));
Run Code Online (Sandbox Code Playgroud)

我的问题是我的Runnable类创建了许多Lucene Field对象,我宁愿重用它们,然后在每次调用时创建新的对象.重用这些对象的最佳方法是什么(Field对象不是线程安全的,所以我不能简单地让它们变得静态) - 我应该自己创建ThreadFactory吗?我注意到一段时间后程序开始急剧下降,我唯一能想到的就是它的GC开销.我目前正在尝试对该项目进行分析,以确保这甚至是一个问题 - 但现在让我们假设它是.

java lucene concurrency multithreading

4
推荐指数
2
解决办法
5568
查看次数