小编Mic*_*urd的帖子

是否有使用当前线程的ExecutorService?

我所追求的是一种配置线程池使用的兼容方式.理想情况下,其余代码不应受到影响.我可以使用一个线程池与1个线程,但这不是我想要的.有任何想法吗?

ExecutorService es = threads == 0 ? new CurrentThreadExecutor() : Executors.newThreadPoolExecutor(threads);

// es.execute / es.submit / new ExecutorCompletionService(es) etc
Run Code Online (Sandbox Code Playgroud)

java concurrency

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

单线程处理任务而不排队进一步的请求

我要求异步执行任务,同时丢弃任何进一步的请求,直到任务完成.

同步方法只是将任务排队,不会跳过.我最初想过使用SingleThreadExecutor,但也排队等待任务.然后我查看了ThreadPoolExecutor,但是它读取队列以获取要执行的任务,因此将执行一个任务并且至少有一个任务排队(其他任务可以使用ThreadPoolExecutor.DiscardPolicy丢弃).

我唯一能想到的就是使用信号量来阻止队列.我带着以下示例来展示我想要实现的目标.有更简单的方法吗?我错过了一些明显的事吗?

import java.util.concurrent.*;

public class ThreadPoolTester {
    private static ExecutorService executor = Executors.newSingleThreadExecutor();
    private static Semaphore processEntry = new Semaphore(1);

    public static void main(String[] args) throws InterruptedException {
        for (int i = 0; i < 20; i++) {
            kickOffEntry(i);

            Thread.sleep(200);
        }

        executor.shutdown();
    }

    private static void kickOffEntry(final int index) {
        if (!processEntry.tryAcquire()) return;
        executor.
            submit(
                new Callable<Void>() {
                    public Void call() throws InterruptedException {
                        try {
                            System.out.println("start " + index);
                            Thread.sleep(1000); // pretend to do work
                            System.out.println("stop " …
Run Code Online (Sandbox Code Playgroud)

java concurrency unit-of-work java.util.concurrent

9
推荐指数
1
解决办法
4776
查看次数

如何将UNION查询视为子查询

我有一组表,逻辑上是出于性能原因将一个表拆分成多个表.我需要编写一个有效地将所有表连接在一起的查询,因此我使用结果的单个where子句.我已成功使用UNION对每个子表明确使用WHERE子句的结果,如下所示

SELECT * FROM FRED_1 WHERE CHARLIE = 42
UNION 
SELECT * FROM FRED_2 WHERE CHARLIE = 42
UNION 
SELECT * FROM FRED_3 WHERE CHARLIE = 42
Run Code Online (Sandbox Code Playgroud)

但由于有十个单独的子表更新WHERE子句每次都很痛苦.我想要的是这样的

SELECT * 
FROM (
    SELECT * FROM FRED_1 
    UNION 
    SELECT * FROM FRED_2 
    UNION 
    SELECT * FROM FRED_3) 
WHERE CHARLIE = 42
Run Code Online (Sandbox Code Playgroud)

如果它有所不同,则查询需要针对DB2数据库运行.

这是我需要做的更全面(消毒)的版本.

select * 
from ( select * from FRD_1 union select * from FRD_2 union select * from FRD_3 ) as FRD, 
     ( select * from REQ_1 union select …
Run Code Online (Sandbox Code Playgroud)

sql db2 union subquery

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

grails域类必须绑定到数据库吗?

当谈到grails时,我是一个完整的菜鸟(当谈到groovy时,我仍然非常乏味)所以如果这是一个愚蠢的问题,我道歉.

我正在构建一个简单的Web应用程序,我想基于文件系统对象(即目录结构和文件类型)而不是数据库数据来控制应用程序中的部分域.这样做有多容易,或者与GORM交织在一起的域对象是不值得尝试的?

grails groovy grails-domain-class

8
推荐指数
1
解决办法
2879
查看次数

如何重构@Transactional方法来拆分非事务性部分

我有一个数据访问类,它作为独立的Java应用程序的一部分运行.它目前正在工作,这意味着定义了一个事务管理器,但我想重构该类以减少事务的范围,但如果我这样做,我得到org.hibernate.HibernateException:没有Hibernate Session绑定到线程,并且配置不允许在这里创建非事务性的,这意味着移动@Transactional会以某种方式阻止它被识别.

我的原始版本的重构方法是私有的,但我发现建议将其更改为public,因为在某些情况下注释不会被选中.

public class DoStuff {
    @Transactional
    public void originalMethod() {
        // do database stuff
        ...

        // do non-database stuff that is time consuming
        ...
    }
}
Run Code Online (Sandbox Code Playgroud)

我想要做的是重构以下内容

public class DoStuff {
    public void originalMethod() {
        doDatabaseStuff()

        doNonDatabaseStuff()
    }

    @Transactional
    public void doDatabaseStuff() {
        ...
    }

    public void doNonDatabaseStuff() {
        ...
    }
}
Run Code Online (Sandbox Code Playgroud)

java hibernate transactions spring-annotations hibernate-annotations

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