import java.sql.Array; import java.sql.Blob; import java.sql.CallableStatement; import java.sql.Clob; import java.sql.Connection; import java.sql.DatabaseMetaData; import java.sql.NClob; import java.sql.PreparedStatement; import java.sql.SQLClientInfoException; import java.sql.SQLException; import java.sql.SQLWarning; import java.sql.SQLXML; import java.sql.Savepoint; import java.sql.Statement; import java.sql.Struct; import java.util.Map; import java.util.Properties; import java.util.UUID; import java.util.concurrent.Executor; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; public class SpringTransactionTest { ThreadLocal<String> threadLocal = new ThreadLocal<>(); static ExecutorService executorService = Executors.newFixedThreadPool(4); public static void main(String[] args)throws Exception { final SpringTransactionTest springTransactionTest = new SpringTransactionTest(); /*for(int i=0;i<10;i++){ executorService.execute(new Runnable() { @Override public void run() { // TODO Auto-generated method stub springTransactionTest.updateDB(); }; }); } Thread.sleep(10000); for(int i=0;i<10;i++){ executorService.execute(new Runnable() { @Override public void run() { // TODO Auto-generated method stub springTransactionTest.updateDB(); }; }); }*/ //并发执行数据库修改操作,线程池中, //每个线程对象持有数据库Connection对象在线程上下文中,没有释放。时间一久,会引起浪费,超时,等问题 //解决办法 (推荐2) //1.手动释放线程上下文中的 数据库连接池对象connection //2.从设计角度上解决此问题,不要在线程池中获取数据库连接池 for(int i=0;i<10;i++){ executorService.execute(new Thread() { @Override public void run() { // TODO Auto-generated method stub springTransactionTest.updateDB(); }; }); } Thread.sleep(10000); for(int i=0;i<10;i++){ executorService.execute(new Runnable() { @Override public void run() { // TODO Auto-generated method stub springTransactionTest.updateDB(); }; }); } } //执行数据库修改操作 (spring加事物) public void updateDB(){ String threadId = Thread.currentThread().getId()+""; String connection = getConnection(); System.out.println("threadId="+threadId+" connectionId="+connection); //update } //获取数据库连接池 连接 public String getConnection(){ String connection = threadLocal.get(); if(connection==null){ threadLocal.set(UUID.randomUUID().toString()); } return threadLocal.get(); } }
相关推荐
spring的5中事物配置 介绍spring的5中事物配置
以注解方式模拟Spring IoC AOP,了解Spring是如何实现的.
spring事物代码片段,包含了定义输入传播性,和参与事物的类
模拟实现__Spring的Ioc 1、Spring主要两个作用:实例化Bean,动态装配Bean。并将所有的bean放到spring容器中,调用时从容器中取。Spring容器就是一个bean的Map:private Map, Object> beans = new HashMap, Object>...
spring的2个数据源的配置,并且每个数据源都配置了事物管理。还有rabbitMQ的发送端代码。本人项目亲自用到的,可以运行。
基于springcloud +dubbo构建的模拟秒杀微服务项目,集成了分库分表、elasticsearch、gateway、mybatis-plus、spring-session等常用开源组件。 基于springcloud +dubbo构建的模拟秒杀微服务项目,集成了分库分表、...
自己写了一个Spring IoC的模拟,有详细注释,可供刚入门学习spring的童鞋加深理解.
spring.net 声明式事物管理小示例,有完整的配置,以及测试
Spring.Net+Nhibernate多数据库操作示例代码
利用AOP定义声明式事物,配置事务管理器 , 配置事务的通知,配置事物代理,被注入的目标对象假如向拥有事务,必须有接口(AOP事务必须面向接口)
spring事物的隔离级别,spring对于事物的操作隔离级别分为文档中的几种
SpringIOC和AOP实现机制模拟,来自与网络。
struts2+hibernate+spring多表操作
SpringJDBC事物SpringJDBC事物SpringJDBC事物SpringJDBC事物SpringJDBC事物SpringJDBC事物SpringJDBC事物SpringJDBC事物
NULL 博文链接:https://huangminwen.iteye.com/blog/1874200
这是个模拟spring ioc的学习例子,是个java工程。有助于对aop和ioc的理解
代码详解:http://blog.csdn.net/csh624366188/article/details/7637705
spring ioc以及事物架构图
学习spring Cloud不错的学习资料