junit并发访问数据库引发的问题
来源:互联网 发布:淘宝的聚划算怎么抢 编辑:程序博客网 时间:2024/06/05 09:52
单元测试的代码是这样的,多线程访问数据库
public class B2BProductWriteManageImpl2Test extends BaseTest implements Runnable{ @Resource(name="b2BProductWriteManage2") private B2BProductWriteManage2 b2BProductWriteManage2; final Semaphore semp = new Semaphore(50); @Test public void addOrUpdateMpInfoWithTx() throws Exception { B2BProductWriteManageImpl2Test b = new B2BProductWriteManageImpl2Test(); List<Thread> threads = new ArrayList<>(); for (int i=0; i< 50; i++) { threads.add(new Thread(b)); } for (Thread t : threads) { t.start(); } } public void tt() throws Exception { b2BProductWriteManage2 = SpringUtils.getBean("b2BProductWriteManage2"); for (int i= 0; i<50; i++) { MerchantProductB2BDTO merchantProductB2BDTO = new MerchantProductB2BDTO(); merchantProductB2BDTO.setMpId(274340L); merchantProductB2BDTO.setBarCode("6926892522052"); merchantProductB2BDTO.setMerchantId(-2L); merchantProductB2BDTO.setMpCode("13231233"); merchantProductB2BDTO.setMpCode("1551"); merchantProductB2BDTO.setCompanyId(11L); List<String> urls = new ArrayList<String>(); urls.add("http://test1.png"); urls.add("http://test2.png"); urls.add("http://test3.png"); urls.add("http://test4.png"); urls.add("http://test5.png"); merchantProductB2BDTO.setPicUrl(urls);// 操作数据库 b2BProductWriteManage2.addOrUpdateMpInfoWithTx(merchantProductB2BDTO); } } @Override public void run() { try { semp.acquire(); System.out.println("current thread name:" + Thread.currentThread().getName()); tt(); semp.release(); } catch (Exception e) { e.printStackTrace(); } }}
然后就报了个Data source is closed的错。
org.springframework.transaction.CannotCreateTransactionException: Could not open JDBC Connection for transaction; nested exception is java.sql.SQLException: Data source is closed
查资料说是junit不支持多线程单元测试,因为源码里面有个System.exit();
猜测是junit运行单元测试的时候会将当前线程作为主线程,主线程运行结束后退出,会引起其他子线程强制退出。
Semaphore信号量的本意是增大并发的可能。
最后加了个CountDownLatch解决了主线程退出的问题。
public class B2BProductWriteManageImpl2Test extends BaseTest implements Runnable{ @Resource(name="b2BProductWriteManage2") private B2BProductWriteManage2 b2BProductWriteManage2; static final int clientCount = 100; final Semaphore semp = new Semaphore(clientCount); CountDownLatch latch = new CountDownLatch(clientCount); private static final Logger log = LoggerFactory.getLogger(B2BProductWriteManageImpl2Test.class); @Test public void addOrUpdateMpInfoWithTx2() throws Exception { MerchantProductB2BDTO merchantProductB2BDTO = new MerchantProductB2BDTO(); merchantProductB2BDTO.setMpId(274340L); merchantProductB2BDTO.setBarCode("6926892522052"); merchantProductB2BDTO.setMerchantId(-2L); merchantProductB2BDTO.setMpCode("13231233"); merchantProductB2BDTO.setMpCode("1551"); merchantProductB2BDTO.setCompanyId(11L); merchantProductB2BDTO.setAppId(1+""); List<String> urls = new ArrayList<String>(); urls.add("http://test1.png"); urls.add("http://test2.png"); urls.add("http://test3.png"); urls.add("http://test4.png"); urls.add("http://test5.png"); merchantProductB2BDTO.setPicUrl(urls); // log.info("current thread name:" + Thread.currentThread().getName() + ":" + 1); b2BProductWriteManage2.addOrUpdateMpInfoWithTx(merchantProductB2BDTO); } @Test public void addOrUpdateMpInfoWithTx() throws Exception { B2BProductWriteManageImpl2Test b = new B2BProductWriteManageImpl2Test(); List<Thread> threads = new ArrayList<>(); for (int i=0; i< clientCount; i++) { threads.add(new Thread(b)); } for (Thread t : threads) { t.start(); } try { latch.await(); } catch (InterruptedException e) { e.printStackTrace(); } } public void tt() throws Exception { b2BProductWriteManage2 = SpringUtils.getBean("b2BProductWriteManage2"); for (int i= 0; i<clientCount; i++) { final int index = i; MerchantProductB2BDTO merchantProductB2BDTO = new MerchantProductB2BDTO(); merchantProductB2BDTO.setMpId(274340L); merchantProductB2BDTO.setBarCode("6926892522052"); merchantProductB2BDTO.setMerchantId(-2L); merchantProductB2BDTO.setMpCode("13231233"); merchantProductB2BDTO.setMpCode("1551"); merchantProductB2BDTO.setCompanyId(11L); merchantProductB2BDTO.setAppId(index+""); List<String> urls = new ArrayList<String>(); urls.add("http://test1.png"); urls.add("http://test2.png"); urls.add("http://test3.png"); urls.add("http://test4.png"); urls.add("http://test5.png"); merchantProductB2BDTO.setPicUrl(urls); // log.info("current thread name:" + Thread.currentThread().getName() + ":" + index); b2BProductWriteManage2.addOrUpdateMpInfoWithTx(merchantProductB2BDTO); } } @Override public void run() { try { semp.acquire(); tt(); semp.release(); } catch (Exception e) { e.printStackTrace(); } }
阅读全文
0 0
- junit并发访问数据库引发的问题
- 并发引发的问题
- 记录ICallbackEventHandler 同时并发访问容易引发的问题
- 高并发访问数据库问题
- 高并发访问数据库问题
- 并发插入引发的死锁问题排查
- 并发插入引发的死锁问题排查
- 删除引发的数据库问题
- 多用户或并发数据库访问或操作的问题
- memcache解决高并发高访问的数据库瓶颈问题
- 关于服务器并发访问导致重复写数据库的问题
- 利用Memcache解决数据库高并发访问的瓶颈问题
- memcache解决高并发高访问的数据库瓶颈问题
- 用Memcache解决数据库高并发访问的瓶颈问题
- 利用Memcache解决数据库高并发访问的瓶颈问题
- 利用Memcache解决数据库高并发访问的瓶颈问题
- JUnit关于数据库访问的单元测试 (2)
- JUnit关于数据库访问的单元测试 (fi)
- websocket,无法建立到 ws://... 服务器的连接
- 大数据量查询优化——数据库设计、SQL语句、JAVA编码
- C/C++遇到的问题及分析
- order by与group by与时间同时存在问题
- LeetCode-009 Palindrome Number
- junit并发访问数据库引发的问题
- 二叉树前序,中序,后序遍历详解
- C++知识总结思维导图
- Slim研读笔记五之依赖注入容器(中)
- LeetCode 115. Distinct Subsequences
- Yii中的安全防护
- HDU 5775 Bubble Sort(归并排序+逆序数)
- 20171206_工作记录
- Excel在统计分析中的应用—第九章—非参数检验-x2检验-拟合优度检验