小编Ale*_*ing的帖子

SQL原子增量和锁定策略 - 这样安全吗?

我有一个关于SQL和锁定策略的问题.例如,假设我的网站上有图像的视图计数器.如果我有一个或类似的,请执行以下语句:

START TRANSACTION;
UPDATE images SET counter=counter+1 WHERE image_id=some_parameter;
COMMIT;
Run Code Online (Sandbox Code Playgroud)

假设特定image_id的计数器在时间t0具有值"0".如果两个会话更新相同的图像计数器,s1和s2,在t0同时启动,那么这两个会话是否都有可能读取值'0',将其增加为'1'并且都尝试将计数器更新为'1 ',那么计数器会得到值'1'而不是'2'?

s1: begin
s1: begin
s1: read counter for image_id=15, get 0, store in temp1
s2: read counter for image_id=15, get 0, store in temp2
s1: write counter for image_id=15 to (temp1+1), which is 1 
s2: write counter for image_id=15 to (temp2+1), which is also 1
s1: commit, ok
s2: commit, ok
Run Code Online (Sandbox Code Playgroud)

结果:image_id = 15的值'1'不正确,应为2.

我的问题是:

  1. 这种情况可能吗?
  2. 如果是这样,事务隔离级别是否重要?
  3. 是否有冲突解决方案将这种冲突视为错误?
  4. 可以使用任何特殊语法以避免出现问题(例如比较和交换(CAS)或显式锁定技术)吗?

我对一般答案很感兴趣,但如果没有,我对MySql和InnoDB特定的答案感兴趣,因为我正在尝试使用这种技术在InnoDB上实现序列.

编辑:以下方案也可能,导致相同的行为.我假设我们处于隔离级别READ_COMMITED或更高级别,因此s2从事务开始获取值,尽管s1已经向计数器写入"1".

s1: begin
s1: begin
s1: read counter …
Run Code Online (Sandbox Code Playgroud)

sql locking atomic increment

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

Spring构造函数注入SLF4J logger - 如何获取注入目标类?

我正在尝试使用Spring将SLF4J记录器注入类中,如下所示:

@Component
public class Example {

  private final Logger logger;

  @Autowired
  public Example(final Logger logger) {
    this.logger = logger;
  }
}
Run Code Online (Sandbox Code Playgroud)

我找到了这个FactoryBean课程,我已经实现了.但问题是我无法获得有关注射目标的任何信息:

public class LoggingFactoryBean implements FactoryBean<Logger> {

    @Override
    public Class<?> getObjectType() {
        return Logger.class;
    }  

    @Override
    public boolean isSingleton() {  
        return false;
    }

    @Override
    public Logger getObject() throws Exception {
        return LoggerFactory.getLogger(/* how do I get a hold of the target class (Example.class) here? */);
    }
}   
Run Code Online (Sandbox Code Playgroud)

FactoryBean甚至是正确的方法吗?当使用picocontainers 工厂注入时,你会得到Type传入的目标.在guice中它有点棘手.但是你如何在Spring中实现这一目标?

java spring slf4j constructor-injection

15
推荐指数
3
解决办法
2万
查看次数

用于反转字节顺序/更改字节顺序的命令行

我在一些脚本中乱砍,试图解析Javas编写的一些数据DataOutputStream#writeLong(...).由于java似乎总是写大端,我在将字节输入时遇到问题od.这是因为od总是假设endianess与你当前所在的arch的endianess匹配,而且我在一个小端机器上.

我正在寻找一个简单的单行程来反转字节顺序.假设你知道文件的最后8个字节是由前面提到的writeLong(...)方法编写的.我目前打印这篇文章的最佳尝试是

tail -c 8 file | tac | od -t d8
Run Code Online (Sandbox Code Playgroud)

,但tac似乎只对文本有效(足够公平).我找到了一些引用dd conv=swab,但这只是成对交换字节,并且不能反转这八个字节.

有谁知道这个好的单行程?

java swap endianness dataoutputstream

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

写我自己的'一切都是文件'界面

我想以"一切都是文件"的方式公开我的程序的设置和统计信息 - 有点/ proc /和/ sys /如何工作.

举个例子,想象一下apache2有这种类型的接口.然后你就可以做这样的事情(假设):

cd /apache2/virtual_hosts
mkdir 172.20.30.50
cd 172.20.30.50
echo '/www/example1' > DocumentRoot
echo 'www.example1.com' > ServerName
echo 1 > control/enabled
cat control/status
   enabled true
   uptime 4080
   hits 0
Run Code Online (Sandbox Code Playgroud)

现在,有没有关于如何做到这一点的教程或类似内容?我主要是寻找'假装成文件或目录'的技巧.我在linux,POSIX或其他更便携的方法会更好,但不是必需的.

unix linux posix

10
推荐指数
1
解决办法
341
查看次数

Eclipse Java:"创建字段"快速修复建议的模板?

在构造函数中,我经常指定一个不存在的字段,并在"CurrentType"类型中选择Ctrl + 1"Create field'memberField'".

问题是我希望默认情况下该字段是最终字段,而不是.这个快速修复的某个地方有模板吗?谢谢.

java eclipse templates

10
推荐指数
1
解决办法
2628
查看次数

〜1s延迟控制应用程序:这适用于Java吗?

在我的工作中,我们最近完成了控制应用程序的系统架构,其最大延迟大约为一到两秒.它分布在通过IP LAN进行通信的小型ARM片上盒中.

我们最初预见到我们会使用C或C++,因为它是一种经典的控制系统语言.在讨论了如何实现应用程序之后,我们现在意识到C++具有相当有限的库,缺乏内省,并且具有一些可能减慢开发的其他属性.我的同事随后建议Java可能会胜任这项工作.

我真的害怕为控制应用程序运行GC的延迟,我也不愿意放弃RAII,因为应用程序将使用大量外部资源(套接字,文件句柄,外部库等句柄等).

pro/con列表目前如下:

C++

+ RAII - Easy resource management - it will be a complex system
+ System language - speed if we cant't find a JIT VM for our ARM
+ No GC - no big worst case latencies from the GC
+ Easy to integrate with some shared mem libs that we have to interface with
- Fewer free as in beer libs 
- Lacks introspection - Mapping classes to DB and external data formats …
Run Code Online (Sandbox Code Playgroud)

c++ java controls garbage-collection raii

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

如何从主方法启动Vertx 3 Verticle?

如何从主方法启动Verx 3 Verticle?我已经想出如何从单元测试开始它,入门指南解释了如何构建一个胖罐.但是,我如何从主方法启动它以进行调试,分析等?

java vertx3

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

为什么不在body元素上使用javascript处理程序?

作为对"网页加载时如何自动将焦点设置为文本框?"问题的回答,Espo建议使用

<body onLoad="document.getElementById('<id>').focus();">
Run Code Online (Sandbox Code Playgroud)

Ben Scheirman 回复(未作进一步解释):

任何javascript书都会告诉你不要把处理程序放在body元素上

为什么这被认为是不好的做法?在Espos答案中,说明了"覆盖"问题.这是唯一的原因,还是有其他问题?兼容性问题?

html javascript handlers javascript-events onload

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

Maven - 聚合的"全部"或"父母"项目?

出于教育目的,我已经建立了一个像这样的项目布局(为了更好地适应日食):

-product
 |
 |-parent
 |-core
 |-opt
 |-all
Run Code Online (Sandbox Code Playgroud)

Parent包含一个包含core,opt和all的聚合项目.Core实现了应用程序的强制部分.Opt是可选部分.所有这些都应该将core与opt结合起来,并将这两个模块列为依赖项.

我现在正在尝试制作以下工件:

  1. 产品core.jar添加
  2. 产品核心src.jar
  3. 产品的核心与 - dependencies.jar
  4. 产品opt.jar
  5. 产品-OPT-src.jar
  6. 产品选择与 - dependencies.jar
  7. 产品all.jar在
  8. 产品全src.jar
  9. 产品全有,dependencies.jar

他们中的大多数生产相当简单.虽然我对聚合工件有一些问题.我已经设法在'all'模块中使用自定义程序集描述符生成product-all-src.jar,该模块下载所有非传递deps的源代码,这样可以正常工作.这种技术还允许我使用all-with-dependencies.jar.

然而,我最近发现您可以使用source插件中的source:aggregate目标来聚合整个聚合项目的源.对于javadoc插件也是如此,它也通过父项目的使用进行聚合.

所以我在'all'模块方法和放弃'all'模块之间徘徊,只使用'parent'模块进行所有聚合.在"父"中产生一些聚合工件并且在"所有"中产生其他工件感觉不洁净.有没有办法在父项目中创建'product-all'jar,或者在'all'项目中聚合javadoc?或者我应该保留两者?

谢谢

java maven-2 aggregate maven maven-assembly-plugin

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

XML和XSD - 使用元素名称替换xsi:type for polymorphism

以W3C车辆XSD为例:

<schema xmlns="http://www.w3.org/2001/XMLSchema"
           targetNamespace="http://cars.example.com/schema"
           xmlns:target="http://cars.example.com/schema">

  <complexType name="Vehicle" abstract="true"/>

  <complexType name="Car">
    <complexContent>
      <extension base="target:Vehicle"/>
      ...
    </complexContent>
  </complexType>

  <complexType name="Plane">
    <complexContent>
      <extension base="target:Vehicle"/>
      <sequence>
        <element name="wingspan" type="integer"/>
      </sequence>
    </complexContent>
  </complexType>      
</schema>
Run Code Online (Sandbox Code Playgroud)

,以及'meansOfTravel'的以下定义:

<complexType name="MeansOfTravel">
  <complexContent>
    <sequence>        
      <element name="transport" type="target:Vehicle"/>        
    </sequence>
  </complexContent>
</complexType>

<element name="meansOfTravel" type="target:MeansOfTravel"/>
Run Code Online (Sandbox Code Playgroud)

使用此定义,您需要使用xsi:type指定实例的类型,如下所示:

<meansOfTravel>
  <transport xsi:type="Plane">
     <wingspan>3</wingspan>
  </transport>
</meansOfTravel>
Run Code Online (Sandbox Code Playgroud)

我只想实现一个'类型名称' - '元素名称'映射,以便可以用just替换它

<meansOfTravel>
  <plane>
    <wingspan>3</wingspan>
  </plane>
</meansOfTravel>
Run Code Online (Sandbox Code Playgroud)

直到现在我能做到这一点的唯一方法是明确:

<complexType name="MeansOfTravel">
  <sequence>        
    <choice>
      <element name="plane" type="target:Plane"/>
      <element name="car" type="target:Car"/>         
    </choice>
  </sequence>
</complexType>

<element name="meansOfTravel" type="target:MeansOfTravel"/>
Run Code Online (Sandbox Code Playgroud)

但这意味着我必须在'MeansOfTravel'复杂类型中列出所有可能的子类型.如果你调用元素'plane',是否有办法让XML解析器假设你的意思是'Plane'?或者我必须明确做出选择吗?我只想保持我的设计干 - 如果你有任何其他建议(如团体等) - 我都是耳朵.

xml polymorphism xsd xsitype

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