最近我一直在阅读很多关于并发编程如何变得困难的文章,以及如何使用共享状态进行并发编程几乎是不可能的.因此,像Erlang这样的语言(我认为这是开启的,如果不是问题仍然有意义)使用Actor模型进行并发,并且在线程之间没有共享状态.现在,在编写并发系统的时候,我并没有发现并发性很难 - 但总的来说,我几乎可以将任何问题都纳入生产者/消费者范例,并且没有太多(如果有的话)共享状态.虽然这是正确的吗?线程之间的消息队列是否实际上是共享状态?或者并发编程的生产者/消费者模型真的是Actor模型的具体示例(这是我真正的问题).思考?
通常情况下,您可能会有一个检查众多条件并返回状态的方法(现在就说布尔值).最好定义一个标志,在方法中设置它,并在结尾返回它:
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块和所有其他类型的条件,但我认为这个概念很清楚.意见?
我正在使用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)
思考?
我在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"消息(并且线程未启动).
我正在重构一些Spring JDBC代码,其中一些成本较高的查询执行"SELECT*FROM ..." - 并且即将开始检查实际需要哪些列,而只是SELECT x,y FROM ..它们.但通过ResultSet类读取似乎大多数数据都是延迟加载的.当您执行ResultSet.next()时,它会移动数据库中的游标(此应用程序中的Oracle 10g),当您执行ResultSet.getXX()时,它会检索该列.所以我的想法是,如果你做一个"SELECT*"但只检索你想要的列,你并没有真正受到性能影响.我正确地考虑了这个吗?我能想到的唯一可以解决这个问题的地方是数据库,因为它将查询结果存储在内存中并且必须使用更多内存,如果只选择了几行,那么它实际上只会存储指向那些击中查询的列甚至不是这种情况.
思考?
注意:这仅适用于标准ResultSet,我知道CachedResultSet的行为不同.
我正在编写一个通用的Http资源托管服务,并将更大的对象作为BLOB存储在Oracle数据库中.我希望能够在返回存储对象时设置'Content-Length'标头,这意味着我需要在开始将其写入客户端之前知道BLOB的大小(我知道我可以使用chunked-encoding,并且我在某些情况下).有没有人有任何关于调用dbms_lob.getlength()在每次读取时都会遇到的性能影响的经验,还是应该在INSERT上计算BLOB大小并将其存储在表中?平均而言,我希望写入速率高于读取速率.我现在正在写一个基准试图看看它的影响是什么,但我认为有人可能已经想到这个问题似乎是一个常见的问题.另外,使用JDBC/Spring 3,我怎么能在写入时计算BLOB大小?(我不能使用触发器或存储过程)谢谢.
我正在构建RESTful数据存储并利用条件GET和PUT.在条件PUT期间,客户端可以在资源上包含来自先前GET的Etag,并且如果当前表示与服务器不匹配,则将返回HTTP状态代码412(前提条件失败).请注意,这是一个基于Atom的服务器/协议.
我的问题是,当我返回412状态时,我是否还可以包含资源的新表示形式,还是用户必须发出新的GET?HTTP规范似乎没有说是或否,Atom规范也没有(尽管它们的示例在响应中显示了一个空的实体主体).如果不返回新的表示并使客户端专门获取它,这似乎是非常浪费的.思考?
我们有许多具有多个活动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 Framework的帮助下实现Oracle连接池.我们正在使用DBCP连接池方法.然而,DBCP和spring之间的集成并没有那么好.
我们面临的问题是DBCP返回PoolableConnections对象,而Oracle期望OracleConnection对象.(引发ClassCastException)
似乎已在Oracle 11g中处理此问题.但是我很好奇其他人如何使用Spring 10 for Oracle 10g(使用TOMCAT)实现Oracle连接池.
我们使用Ibatis作为ORM框架.
我相信有办法.任何帮助表示赞赏.
我有一个实现的类,Runnable目前正在使用Executor作为我的线程池来运行任务(将文档索引到Lucene).
executor.execute(new LuceneDocIndexer(doc, writer));
Run Code Online (Sandbox Code Playgroud)
我的问题是我的Runnable类创建了许多Lucene Field对象,我宁愿重用它们,然后在每次调用时创建新的对象.重用这些对象的最佳方法是什么(Field对象不是线程安全的,所以我不能简单地让它们变得静态) - 我应该自己创建ThreadFactory吗?我注意到一段时间后程序开始急剧下降,我唯一能想到的就是它的GC开销.我目前正在尝试对该项目进行分析,以确保这甚至是一个问题 - 但现在让我们假设它是.
java ×7
spring ×5
concurrency ×2
jdbc ×2
oracle ×2
spring-boot ×2
tomcat ×2
actor ×1
atom-feed ×1
coding-style ×1
ehcache ×1
http ×1
ibatis ×1
lucene ×1
oracle10g ×1
properties ×1
rest ×1
resultset ×1
return-path ×1