`

jdbc 更新 测 并发

    博客分类:
  • java
 
阅读更多

用到 junitperf-1.9.1.jar 这个包

用到 junit4

 

package com.bingfa;
import java.sql.Connection;

public final class JDBCUtils {
	private JDBCUtils() {
	}

	private static String url = "jdbc:mysql://localhost:3306/test";
	private static String user = "root";
	private static String password = "root";

	static {
		try {
			Class.forName("com.mysql.jdbc.Driver");
		} catch (ClassNotFoundException e) {
			throw new ExceptionInInitializerError(e);
		}
	}

	public static Connection getConnection() throws SQLException {
		return DriverManager.getConnection(url, user, password);
	}

	public static void freePs(ResultSet rs, PreparedStatement ps, Connection conn) {
		try {
			if (rs != null)
				rs.close();
		} catch (SQLException e) {
			e.printStackTrace();
		} finally {
			try {
				if (ps != null)
					ps.close();
			} catch (SQLException e) {
				e.printStackTrace();
			} finally {
				try {
					if (conn != null)
						conn.close();
				} catch (SQLException e) {
					e.printStackTrace();
				}
			}
		}
	}
	
	
	public static void freeSt(ResultSet rs, Statement st, Connection conn) {
		try {
			if (rs != null)
				rs.close();
		} catch (SQLException e) {
			e.printStackTrace();
		} finally {
			try {
				if (st != null)
					st.close();
			} catch (SQLException e) {
				e.printStackTrace();
			} finally {
				try {
					if (conn != null)
						conn.close();
				} catch (SQLException e) {
					e.printStackTrace();
				}
			}
		}
	}
}

 

更新表,里面有用Statement和PreparedStatement两种方式

package com.bingfa;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.Statement;

public class UploadCC {
	

	public static void JDBCStatment() throws Exception {
		Connection conn = null;
		Statement st = null;
		ResultSet rs = null;
		try {
			conn = (Connection) JDBCUtils.getConnection();
			conn.setAutoCommit(false);
			
			String sql = "";
			sql = "SELECT cc FROM test WHERE id=1 ";
			st = conn.createStatement();
			rs = st.executeQuery(sql);
			int c = 0;
			while (rs.next()) {
				c = rs.getInt(1);
			}
			c = c + 1;
//用cc=cc+1,不会有并发问题,如果用c=c+1,则有问题
			sql = "UPDATE test SET cc = cc+1 WHERE id =1 ";
			st=(Statement) conn.createStatement();
			st.execute(sql);
			conn.commit();
			
		} finally {
			JDBCUtils.freeSt(rs, st, conn);
		}
	}
	
	
	
	public static void JDBCPrepare() throws Exception {
		Connection conn = null;
		PreparedStatement ps = null;
		ResultSet rs = null;
		try {
			conn = (Connection) JDBCUtils.getConnection();
			conn.setAutoCommit(false);
			String sql = "";
			sql = "SELECT cc FROM test WHERE id=1 ";
			ps = conn.prepareStatement(sql);
			rs = ps.executeQuery();
			int c = 0;
			while (rs.next()) {
				c = rs.getInt(1);
			}
			c = c + 1;
			sql = "UPDATE test SET cc = ? WHERE id =1 ";
			ps = conn.prepareStatement(sql);
			ps.setInt(1, c);
			ps.execute();
			conn.commit();
		} finally {
			JDBCUtils.freePs(rs, ps, conn);
		}
	}

}
 

测试类,注意,测试并发并不用直接使用此类

package test;

import junit.framework.TestCase;

public class UploadCCTest extends TestCase {

	public UploadCCTest(String name) {
		super(name);
	}

	@org.junit.Test
	public void testJdbcStatment() {
		try {
			UploadCC.JDBCStatment();
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
	
	
	@org.junit.Test
	public void testJdbcPrepare() {
		try {
			UploadCC.JDBCPrepare();
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

}

 

 

用这个类进行并发测试

package test;

import com.clarkware.junitperf.LoadTest;
import com.clarkware.junitperf.TestMethodFactory;

import junit.framework.Test;

public class TestSuite {
	public static Test suite() {
		Test suite = new TestMethodFactory(UploadCCTest.class, "testJdbcStatment");
		Test loadTest = new LoadTest(suite, 20, 10);
//如果正常,cc的值应为200,但如果用c=c+1,值肯定小于200
		return loadTest;
	}
	
//	public static Test suite() {
//		Test suite = new TestMethodFactory(UploadCCTest.class, "testJdbcPrepare");
//		Test loadTest = new LoadTest(suite, 20, 10);
//		return loadTest;
//	}
}
 


分享到:
评论

相关推荐

    spark jdbc 读取并发优化

    然而,在使用Spark与数据库交互时,尤其是使用JDBC(Java Database Connectivity)读取数据时,如果不优化并发度,很容易造成性能瓶颈。特别是在面对大规模数据集时,单线程任务过重会导致任务执行缓慢甚至挂起,...

    c3p0 jdbc dbcp tomcatjdbc 乐观锁 高并发测试 4000 以上

    为了更明确怎样开发出高并发程序,本人写了一个测试例子去体验下 C3P0 tomcatJdbc dbcp 他们的并发能力。采用乐观锁控制oracle数据并发访问。测试结果表明在 c3p0 和dbcp 都能执行完4800以下并发线程访问。c3p0 比较...

    jmeter的JDBC测试

    在JMeter中,JDBC请求采样器(JDBC Request Sampler)被用来模拟数据库查询、更新、删除和插入操作,从而评估数据库服务器的性能。 要进行JDBC测试,首先需要在JMeter的"测试计划"中添加"线程组",这代表一组并发...

    Jmeter需要的JDBC测试jar包

    2. 添加“JDBC Request”元件,指定SQL查询或操作,如读取数据、插入记录、更新或删除。 3. 可以添加“View Results Tree”监听器来查看请求的详细结果,包括执行时间、返回结果集等。 4. 设置线程组参数,如并发...

    jmeter 测试工具 使用java自测 并发测试 环境测试 压力测试

    适合java自测 以及测试人员常见接口测试 解压即用 JMeter 最初被设计用于 Web 应用测试,但后来扩展到了其他测试领域,可用于测试静态和动态资源,如静态文件、Java 小服务程序、CGI 脚本、Java 对象、数据库和 FTP...

    Java-JDBC【源码】数据库连接池技术、常规操作与Durid对比、测试(20-200)不同连接数下,10万记录,1万并发

    Java-JDBC【源码】数据库连接池技术、常规操作与Durid对比、测试(20-200)不同连接数下,10万记录,1万并发,CPU磁盘占用情况 1.数据库连接池 2.Durid介绍(官方文档) 3.编码,问题,常规并发操作 3.1.JDBCUtil....

    使用JMeter进行性能测试

    它能够模拟大量并发用户,以此来测试服务器的性能和稳定性。本文将详细介绍如何使用JMeter进行性能测试。 一、JMeter简介 JMeter是由Apache Software Foundation开发的Java应用程序,支持多线程和非图形界面...

    JDBC 模块化应用测试代码.zip

    学习这个代码包,你可以深入了解JDBC的实践应用,如何通过反射优化代码,以及如何利用线程池来提升数据库操作的并发性能。这对于任何Java开发人员,尤其是从事后端开发的工程师来说,都是宝贵的实战经验。同时,它也...

    jdbc-mysql-connector-j-8.0.31.jar jdbc-sqljdbc41.jar

    将`jdbc-sqljdbc41.jar`添加到JMeter的`lib`目录后,用户可以通过配置JDBC Connection Configuration元素来建立与SQL Server的连接,进而创建和运行SQL查询,验证数据库操作的正确性,或者模拟大量并发请求以评估...

    HiveServer2-JDBC及用户权限测试

    * 使用 HiveServer 2.0,可以解决权限和并发问题。 HiveServer2 提供了强大的安全机制,能够确保用户身份的合法性和访问权限的控制。但是,在实际应用中,需要根据不同的测试环境和配置来进行调整和优化。 在本文...

    DBCP,C3P0,Tomcat_JDBC 性能及稳定性测试代码

    本项目提供了对三种常用的Java数据库连接池——DBCP(BasicDataSource)、C3P0和Tomcat JDBC的性能及稳定性测试代码。下面将详细介绍这三个连接池的工作原理、特性以及如何进行性能测试。 1. **DBCP ...

    SQLite JDBC Driver 最新源码 2014.1

    8. **并发与多线程**:由于SQLite本身支持多线程访问,源码可能涉及到如何在多线程环境中安全地使用数据库连接。 9. **JDBC兼容性**:SQLite JDBC Driver必须遵循JDBC的兼容性规范,确保与其他JDBC驱动的一致性,这...

    连接池c3p0 ,Proxool ,Druid ,Tomcat Jdbc Pool对比测试

    然而,C3P0在处理大量并发请求时可能会出现性能瓶颈,且其社区活跃度相对较低,更新维护相对较慢。 2. Proxool Proxool是另一个流行的JDBC连接池实现,它的设计目标是简单易用和高效。Proxool通过创建虚拟的连接池...

    jdbc线程池演示demo

    线程池可以提高应用程序的性能,减少创建和销毁线程的开销,同时管理并发访问数据库的多个请求。本实例中,我们将重点讨论如何使用C3P0这个开源的JDBC连接池工具包来实现这一功能。 C3P0是一个开源的JDBC连接池,它...

    clickhouse-jdbc-0.2.4.jar 和 clickhouse-jdbc-0.2.4-jar-with-dependencies.jar

    Clickhouse-JDBC是Java开发的一款用于连接Clickhouse数据库的驱动,它...在处理大规模数据时,Clickhouse的高性能和高并发能力使得它成为一个理想的选择,而通过JDBC驱动,我们可以无缝地将这些能力融入到Java应用中。

    SqliteJDBC驱动

    用户可以直接运行此可执行文件来创建、打开、查询、更新或管理SQLite数据库文件。此外,开发人员还可以在自动化脚本或测试环境中使用它,以执行数据库相关的任务。 2. sqlitejdbc-v056.jar:这是SQLiteJDBC驱动的库...

    Jmeter中JDBC request多条SQL语句使用.docx

    本文将重点介绍如何在JMeter中使用JDBC Request来执行多条SQL语句,包括查询与更新操作,并针对不同类型的SQL语句提供最佳实践。 #### 二、JDBC Request概述 JDBC Request是JMeter提供的一个用于执行数据库操作的...

Global site tag (gtag.js) - Google Analytics