您的位置:首页 > 编程语言 > Java开发

spring 事物 线程池 测试

2016-03-10 16:05 411 查看
static  ExecutorService executorService = Executors.newFixedThreadPool(1);

public List<Map<String, Object>> queryForListMap(final String sql)
throws Exception {
/*new Thread(){
@Override
public void run() {
//使用当前的 transaction
List<Map<String, Object>>  list=jdbcTemplate.queryForList(sql);
System.out.println(list.size());
}
}.start();*/
/*new Thread(){
@Override
public void run() {
List<Map<String, Object>> list=null;
try {
//使用当前的 transaction
list = queryForListMap2(sql);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println(list.size());
}
}.start();*/

/*new Thread(){
@Override
public void run() {
//Creating new transaction with name
serviceUtil.queryTasks();
}
}.start();*/
/*for(int i=0;i<8;i++){
executorService.execute(new Runnable() {
@Override
public void run() {
//使用当前的 transaction
List<Map<String, Object>>  list=jdbcTemplate.queryForList(sql);
System.out.println(list.size());

System.out.println("ThreadId==="+Thread.currentThread().getId());
//Creating new transaction with name
//每一次Creating new transaction
serviceUtil.queryTasks();
}
});
}*/

/*for(int i=0;i<4;i++){
executorService.submit(new Callable<String>() {
public String call() throws Exception {
//使用当前的 transaction
//List<Map<String, Object>>  list=jdbcTemplate.queryForList(sql);
//System.out.println(list.size());
System.out.println("ThreadId==="+Thread.currentThread().getId());
//Creating new transaction with name
//每一次Creating new transaction
serviceUtil.queryTasks();
return sql;
};
});
}*/

for(int i=0;i<4;i++){
executorService.submit(new Callable<String>() {
public String call() throws Exception {
System.out.println("ThreadId==="+Thread.currentThread().getId());
//Creating new transaction with name
//同一个线程缓存的同一个connection
//每一次Creating new transaction
serviceUtil.queryTasks();
return sql;
};
});
}

//Connection conn = DataSourceUtils.getConnection(jdbcTemplate.getDataSource());

/*for(int i=0;i<8;i++){
//使用当前的 transaction
serviceUtil.queryTasks();
}*/
System.out.println("threadId==="+Thread.currentThread().getId());

return jdbcTemplate.queryForList(sql);
}

   

/**
* Actually obtain a JDBC Connection from the given DataSource.
* Same as {@link #getConnection}, but throwing the original SQLException.
* <p>Is aware of a corresponding Connection bound to the current thread, for example
* when using {@link DataSourceTransactionManager}. Will bind a Connection to the thread
* if transaction synchronization is active (e.g. if in a JTA transaction).
* <p>Directly accessed by {@link TransactionAwareDataSourceProxy}.
* @param dataSource the DataSource to obtain Connections from
* @return a JDBC Connection from the given DataSource
* @throws SQLException if thrown by JDBC methods
* @see #doReleaseConnection
*/
public static Connection doGetConnection(DataSource dataSource) throws SQLException {
Assert.notNull(dataSource, "No DataSource specified");

ConnectionHolder conHolder = (ConnectionHolder) TransactionSynchronizationManager.getResource(dataSource);
if (conHolder != null && (conHolder.hasConnection() || conHolder.isSynchronizedWithTransaction())) {
conHolder.requested();
if (!conHolder.hasConnection()) {
logger.debug("Fetching resumed JDBC Connection from DataSource");
conHolder.setConnection(dataSource.getConnection());
}
System.out.println("threadId==="+Thread.currentThread().getId());
return conHolder.getConnection();
}
// Else we either got no holder or an empty thread-bound holder here.

logger.debug("Fetching JDBC Connection from DataSource");
Connection con = dataSource.getConnection();

if (TransactionSynchronizationManager.isSynchronizationActive()) {
logger.debug("Registering transaction synchronization for JDBC Connection");
// Use same Connection for further JDBC actions within the transaction.
// Thread-bound object will get removed by synchronization at transaction completion.
ConnectionHolder holderToUse = conHolder;
if (holderToUse == null) {
holderToUse = new ConnectionHolder(con);
}
else {
holderToUse.setConnection(con);
}
holderToUse.requested();
TransactionSynchronizationManager.registerSynchronization(
new ConnectionSynchronization(holderToUse, dataSource));
holderToUse.setSynchronizedWithTransaction(true);
if (holderToUse != conHolder) {
TransactionSynchronizationManager.bindResource(dataSource, holderToUse);
}
}

return con;
}

 

   spring事物在线程池中,由于线程对象都是缓存对象,会长期持有数据库连接connection对象。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: