我是Spring Transaction的新手.我发现的一些事情很奇怪,可能我确实理解了这一点.我希望在方法级别有一个事务处理,并且我在同一个类中有一个调用方法,看起来它不喜欢它,它必须从单独的类调用.我不明白这是怎么可能的.如果有人知道如何解决这个问题,我将不胜感激.我想使用相同的类来调用带注释的事务方法.
这是代码:
public class UserService {
@Transactional
public boolean addUser(String userName, String password) {
try {
// call DAO layer and adds to database.
} catch (Throwable e) {
TransactionAspectSupport.currentTransactionStatus()
.setRollbackOnly();
}
}
public boolean addUsers(List<User> users) {
for (User user : users) {
addUser(user.getUserName, user.getPassword);
}
}
}
Run Code Online (Sandbox Code Playgroud) 我已经沮丧了一段时间,其默认行为ThreadPoolExecutor支持ExecutorService我们这么多人使用的线程池.引用Javadocs:
如果有多个corePoolSize但运行的maximumPoolSize线程少于maximumPoolSize,则只有在队列已满时才会创建新线程.
这意味着如果您使用以下代码定义线程池,它将永远不会启动第二个线程,因为它LinkedBlockingQueue是无限制的.
ExecutorService threadPool =
new ThreadPoolExecutor(1 /*core*/, 50 /*max*/, 60 /*timeout*/,
TimeUnit.SECONDS, new LinkedBlockingQueue<Runnable>(/* unlimited queue */));
Run Code Online (Sandbox Code Playgroud)
只有当您有一个有界队列并且队列已满时才会启动核心编号之上的任何线程.我怀疑大量的初级Java多线程程序员并不知道这种行为ThreadPoolExecutor.
现在我有一个特定的用例,这不是最佳的.我正在寻找方法,而不是编写我自己的TPE课程来解决它.
我的要求是针对可能不可靠的第三方回拨的Web服务.
newFixedThreadPool(...)大量的线程,大多数都处于休眠状态.newCachedThreadPool().在更多线程启动之前,如何解决ThreadPoolExecutor队列需要限制和填充的限制?如何让它在排队任务之前启动更多线程?
编辑:
@Flavio提出了使用ThreadPoolExecutor.allowCoreThreadTimeOut(true)核心线程超时并退出的好处.我考虑过这一点,但我仍然想要核心线程功能.如果可能的话,我不希望池中的线程数降到核心大小以下.
这个问题发布在某个网站上.我没有在那里找到正确的答案,所以我再次在这里发布.
public class TestThread {
public static void main(String[] s) {
// anonymous class extends Thread
Thread t = new Thread() {
public void run() {
// infinite loop
while (true) {
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
}
// as long as this line printed out, you know it is alive.
System.out.println("thread is running...");
}
}
};
t.start(); // Line A
t = null; // Line B
// no more references for Thread t
// another infinite …Run Code Online (Sandbox Code Playgroud) 我想避免(大多数)Netbeans 6.9.1的警告,我的'Leaking this in constructor'警告有问题.
我理解这个问题,在构造函数中调用一个方法并传递" this"是危险的,因为" this"可能没有完全初始化.
很容易在我的单例类中修复警告,因为构造函数是私有的,只能从同一个类中调用.
旧代码(简化):
private Singleton() {
...
addWindowFocusListener(this);
}
public static Singleton getInstance() {
...
instance = new Singleton();
...
}
Run Code Online (Sandbox Code Playgroud)
新代码(简化):
private Singleton() {
...
}
public static Singleton getInstance() {
...
instance = new Singleton();
addWindowFocusListener( instance );
...
}
Run Code Online (Sandbox Code Playgroud)
如果构造函数是公共的并且可以从其他类调用,则此修复不起作用.如何修复以下代码:
public class MyClass {
...
List<MyClass> instances = new ArrayList<MyClass>();
...
public MyClass() {
...
instances.add(this);
}
}
Run Code Online (Sandbox Code Playgroud)
当然我想要一个修复,它不需要使用这个类修改我的所有代码(例如通过调用init方法).
我有一个表管理员,只有一列,adminId是主键.由于业务规则,它必须是这样的.
我想一劳永逸地理解如何编写在这样的表中插入值的存储过程.我正在使用SQL Server和T-SQL并尝试使用SCOPE_IDENTITY(),但这不起作用,因为该表具有INSERT_IDENTITY为false或off.
我真的不想插入一个虚拟值只是为了能够插入一个新行.谢谢!
我打算将gradle的使用概括为我的项目,并希望在任何地方重用相同的构建文件.不幸的是,我在单个文件中尝试定义$ subject中提到的属性时遇到了麻烦,以便简化迁移.
这是gradle 1.6.
我尝试了什么,在所有尝试中都失败了:
gradle.properties:无法修改名称(只读,必须使用settings.gradle并覆盖根项目名称!); {source,target}Compatibility没有考虑到;settings.gradle:{source,target}Compatibility没有考虑到!那么,实现这一目标的正确方法是什么?我到目前为止所做的尝试gradle.properties:
group = something
name = whatever # cannot do!
version = whatever
sourceCompatibility = whatever # not taken into account!
Run Code Online (Sandbox Code Playgroud)
并在settings.gradle:
sourceCompatibility = "whatever"; # not taken into account!
Run Code Online (Sandbox Code Playgroud)
编辑嗯,"名称"问题无法解决; 对于其余的,我使用了另一个我在构建文件中应用的文件."名称"处理真的不对:/
编辑2这是2014年和gradle 1.12,问题仍未解决......
你看到使用字节数组作为Map键有什么问题吗?我也可以做new String(byte[])和哈希,String但它更直接使用byte[].
从第11章(性能和可扩展性)和部分命名上下文切换的的JCIP书:
当切换新线程时,它所需的数据不太可能在本地处理器高速缓存中,因此上下文切换会导致一连串的高速缓存未命中,因此线程在首次调度时运行速度会慢一些.
language-agnostic cpu concurrency cpu-architecture cpu-cache
有谁知道这意味着什么?
12-31 20:55:45.861: ERROR/AndroidRuntime(12478): Caused by: java.lang.IllegalArgumentException: the bind value at index 1 is null
12-31 20:55:45.861: ERROR/AndroidRuntime(12478): at android.database.sqlite.SQLiteProgram.bindString(SQLiteProgram.java:234)
12-31 20:55:45.861: ERROR/AndroidRuntime(12478): at android.database.sqlite.SQLiteQuery.bindString(SQLiteQuery.java:182)
12-31 20:55:45.861: ERROR/AndroidRuntime(12478): at android.database.sqlite.SQLiteDirectCursorDriver.query(SQLiteDirectCursorDriver.java:48)
12-31 20:55:45.861: ERROR/AndroidRuntime(12478): at android.database.sqlite.SQLiteDatabase.rawQueryWithFactory(SQLiteDatabase.java:1345)
12-31 20:55:45.861: ERROR/AndroidRuntime(12478): at android.database.sqlite.SQLiteQueryBuilder.query(SQLiteQueryBuilder.java:330)
12-31 20:55:45.861: ERROR/AndroidRuntime(12478): at android.database.sqlite.SQLiteQueryBuilder.query(SQLiteQueryBuilder.java:280)
12-31 20:55:45.861: ERROR/AndroidRuntime(12478): at net.lp.collectionista.providers.ProductContentProvider.query(ProductContentProvider.java:350)
12-31 20:55:45.861: ERROR/AndroidRuntime(12478): at android.content.ContentProvider$Transport.query(ContentProvider.java:163)
12-31 20:55:45.861: ERROR/AndroidRuntime(12478): at android.content.ContentResolver.query(ContentResolver.java:245)
12-31 20:55:45.861: ERROR/AndroidRuntime(12478): at net.lp.collectionista.providers.FacadeContentProvider.query(FacadeContentProvider.java:563)
12-31 20:55:45.861: ERROR/AndroidRuntime(12478): at android.content.ContentProvider$Transport.query(ContentProvider.java:163)
12-31 20:55:45.861: ERROR/AndroidRuntime(12478): at android.content.ContentResolver.query(ContentResolver.java:245)
12-31 20:55:45.861: ERROR/AndroidRuntime(12478): at net.lp.collectionista.util.ScanAddTask.existsProduct(ScanAddTask.java:164) …Run Code Online (Sandbox Code Playgroud) java ×6
amazon-s3 ×1
android ×1
aspectj ×1
boto ×1
bytearray ×1
concurrency ×1
constructor ×1
cpu ×1
cpu-cache ×1
database ×1
gradle ×1
hashmap ×1
netbeans ×1
netbeans-6.9 ×1
spring ×1
spring-aop ×1
sql ×1
sql-server ×1
sqlite ×1
t-sql ×1
this ×1