0 0

java多线程编程,使用sqlserver的存储过程,存到txt文件时的并发问题10

最近自学的时候遇到了这么一个问题……
首先,任务要求是这样的:
1.在数据库中新建一个用户状态表。里面包含2个字段。user_status(userid bigint,status int)
   userid为自增。
   status默认为0;
   插入1000条记录。

2.写一个存储过程,从user_status表中获取一条status=0的userid字段的值,取出userid时,需要同时把这条记录对应的status从0修改为1.

3.开启2个线程,在线程中循环调用第2步中的存储过程,直到user_status表中记录全部取完(即status全部为1)。要求:在2个线程中取出的userid不能重复。并把取出的userid,打印到某个文件中,一行一个userid

 

我的存储过程:

 

ALTER procedure [dbo].[sp_getuserid]
as
declare @userid int
declare @count int
set @count=1
Begin TransAction
select top 1 @userid=userid from user_status where status=0
update user_status set status=1 where status=0 and userid =@userid
set @count = @@ROWCOUNT
If @count=0
begin
rollback TransAction
return 0
end
Else
Begin
select userid from user_status where userid=@userid
Commit TransAction
End 

 java的程序代码:

public class Status implements Runnable {
	
	private int num;

	@Override
	public void run() {
		Boolean flag = true;
		while(flag)
		{
			this.writeFile(this.getUserid());
			try {
				Thread.sleep(1000);
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
		}

	}

	@SuppressWarnings("unchecked")
	public  List<UserBean> getUserid() {
		// 创建数据库连接
		Connection conn = ConnectDb.Connect();

		QueryRunner qRunner = new QueryRunner();
		List<UserBean> list = new ArrayList<UserBean>();
		try {
			list = qRunner.query(conn, "exec sp_getuserid",
					new BeanListHandler(UserBean.class));
		} catch (Exception e) {
			e.printStackTrace();
		}
		DbUtils.closeQuietly(conn);
		return list;

	}

	public  Boolean writeFile(List<UserBean> list) {
		File file = new File("d:/test.txt");
		if (!file.exists())
			try {
				file.createNewFile();
			} catch (IOException e1) {
				// TODO Auto-generated catch block
				e1.printStackTrace();
			}
		if (list==null||list.size()==0)
			return false;
		else {
			try {
				FileOutputStream out = new FileOutputStream(file, true);
				for (int i = 0; i < list.size(); i++) {
					System.out.println("userId:"+list.get(i).getUserid()+"");
					StringBuffer sb = new StringBuffer();
					SimpleDateFormat df = new SimpleDateFormat(
							"yyyy-MM-dd HH:mm:ss:SSS");
					sb.append(df.format(new Date()) + " \t"
							+ list.get(i).getUserid()+ " \t"+this.getNum());
					sb.append(System.getProperty("line.separator"));
					out.write(sb.toString().getBytes("utf-8"));
				}
				out.close();
				return true;
			} catch (Exception e) {
				e.printStackTrace();
				return true;
			}
		}
	}

	public static void main(String[] args) {
			for(int j=0;j<50;j++){
				System.out.println("status["+j+"]"+" start!");
				new Thread(new Status(j)).start();
			}
	}

	public int getNum() {
		return num;
	}

	public void setNum(int num) {
		this.num = num;
	}

	public Status(int num)
	{
		this.num=num;
	}
}

 如何解决并发问题啊,我在隔壁也问过这个问题,但是要求是不能增加字段啊……也许是我写的方法太烂了……

 

现在结果是:在txt中缺少几条数据,但在数据库中已经更新了……也就是说,某些条目虽然在数据库中更新了,但并没有写入到txt中。

2014年5月15日 17:56

2个答案 按时间排序 按投票排序

0 0

这纯粹是练习呀

一般思路是
1.分页获取数据
2.处理数据写入文件
3.统一更新状态

根据楼主的要求,给出如下思路供楼主参考
public class FixedScheduleTest {

public static ScheduledThreadPoolExecutor executor = null;
public static void main(String[] args) {
executor = new ScheduledThreadPoolExecutor(1);
executor.scheduleAtFixedRate(new Runnable() {
@Override
public void run() {
//TODO 1.执行存储过程
//TODO 2.判断是否取完 终端线程 中断程序
//TODO 3.写入文件
/**
* 中断代码
* executor.shutdown();return ;
*/

}
}, 0, 10, TimeUnit.SECONDS);
}

}

2014年5月16日 09:53
0 0

你把所有写文件的操作集成到一个方法里面去,或者写一个文件操作类,把文件的操作放在那里,这样就不会有并发的问题了。你每次要写文件,就把需要添加的内容添加到操作队列就可以了。

2014年5月15日 18:59

相关推荐

    javaswing企业进销存管理系统源码(含sqlserver数据库).rar

    在进销存管理系统的实现中,可能会用到Java的集合框架来存储和处理数据,如ArrayList、HashMap等,以及多线程技术来处理并发操作,如库存同步更新。此外,系统可能还涉及到XML或JSON格式的数据交换,用于与服务器的...

    java代码实现登录注册sqlserver

    在Java编程环境中,实现登录注册功能并连接到SQL Server数据库是一项常见的任务,它涉及到网络通信、数据处理和数据库操作等多个核心领域。以下是一份详细的解释,涵盖了如何使用Java实现这一功能的关键知识点: 1....

    学生信息管理系统(java+sqlserver)

    此外,Java的多线程能力也使得系统在处理大量并发请求时表现稳定。 SQL Server,全称为Microsoft SQL Server,是一款功能强大的关系型数据库管理系统,被广泛应用于企业级数据存储和管理。在本系统中,SQL Server...

    Java+SQL Server项目开发实践

    在本项目中,你可能还会接触到Java的多线程编程,以实现并发处理。 SQL Server作为关系型数据库管理系统,其核心在于SQL语言。理解并熟练使用SELECT、INSERT、UPDATE、DELETE等SQL语句进行数据查询、插入、修改和...

    医院信息管理系统(JAVA+SQL Server)

    JAVA的多线程支持确保了系统在处理并发请求时的稳定性和响应速度。同时,JAVA的跨平台性使得该系统能在多种操作系统上运行,增强了系统的兼容性和灵活性。 SQL Server作为数据库管理系统,提供了高效的数据存储和...

    图书馆管理系统(用java+sql server2000实现)

    同时,Java的多线程特性确保了系统在并发访问时的稳定性。 SQL Server 2000是一款功能强大的关系型数据库管理系统,具备数据存储、查询、备份、恢复等核心功能。在图书馆管理系统中,SQL Server 2000扮演着数据仓库...

    进销存管理系统代码和Sql Server数据库

    6. **多线程**:Java的多线程能力可以实现并发处理,提高系统响应速度,尤其是在处理大量并发请求时。 Sql Server数据库在进销存管理系统中的作用主要包括: 1. **数据存储**:所有进销存数据,如商品信息、订单...

    java+sql server, 图书借阅管理系统,源程序+数据库+代码

    同时,Java的多线程特性使得系统能够处理并发操作,提高用户体验。 其次,SQL Server作为关系型数据库管理系统,具备高性能、高可靠性及丰富的数据管理功能。在图书借阅管理系统中,SQL Server用于存储图书信息(如...

    SQL SERVER +java界面的库存管理系统.zip

    同时,Java的多线程特性使得系统能同时处理多个任务,提高了系统的效率。 库存管理系统的功能通常包括:商品信息管理、库存数量统计、出入库记录、库存预警、供应商管理等。在本系统中,虽然描述提到部分小功能未...

    简易银行卡管理系统——java 实现以及 SQL server 2005数据库

    - **多线程**:在处理并发操作时,如取款、存款等可能涉及账户余额变动的操作,需要使用多线程保证数据的安全性。 - **异常处理**:通过try-catch-finally结构处理可能出现的异常情况,确保程序的稳定运行。 2. *...

    学校图书馆管理系统(java+SQL Server)

    【学校图书馆管理系统】是一个基于Java编程语言和SQL Server数据库技术的综合实训项目,旨在实现对图书馆各类资源的有效管理和便捷检索。这个系统集成了图书借阅、归还、查询、预约、取消预约等功能,同时考虑了权限...

    局域网聊天系统(JAVA+sqlserver)

    1. **多线程处理**:聊天系统需要处理并发的用户请求,因此需要使用JAVA的线程机制来保证多用户的实时通信。 2. **Socket编程**:JAVA的Socket类提供了网络通信的基础,用于建立客户端与服务器之间的连接,实现数据...

    计算机软件-编程源码-具有多线程的数据库备份程序 for SQL Server.zip

    - 通常,针对SQL Server的备份程序可能使用C#、Java或Python等编程语言编写,这些语言都有强大的数据库连接和支持多线程的库。 - .NET Framework或.NET Core可能是此程序的基础,它们提供了对SQL Server的内置支持...

    图书管理系统+Java源代码+SQL Server数据库文件

    《图书管理系统》是一款基于Java编程语言开发的软件应用,它结合了SQL Server数据库技术,为用户提供了一套完整的图书信息管理解决方案。系统的核心功能包括图书的录入、查询、借阅、归还、库存管理以及用户管理等多...

    c# Java SQLserver面试题

    在IT行业中,面试是检验求职者技能和知识的关键环节,特别是对于编程岗位,如C#、Java和SQL Server开发者。这些技术是企业级应用开发的基石,因此掌握它们的深入理解至关重要。以下将分别探讨这些领域的核心知识点。...

    酒店管理系统(2008SQL Server+java+jsp)

    此外,Java的多线程支持也能确保系统在高并发环境下的稳定运行。 JSP(JavaServer Pages)作为Java Web开发的一种技术,主要用于生成动态网页。在酒店管理系统中,JSP负责展示用户界面,将后台处理的结果以友好的...

    使用JAVA语言编写,SQL server 教师信息管理系统

    在本项目中,我们探讨的是一个使用JAVA编程语言编写的教师信息管理系统,该系统与SQL Server数据库紧密结合,用于存储和管理教师的相关数据。这个课程设计旨在帮助学生掌握JAVA语言的实际应用以及数据库系统的交互。...

    毕业设计java+SQL Server2005图书馆管理系统

    【标题】:“毕业设计java+SQL Server2005图书馆管理系统”是一个综合性的项目,它展示了如何使用Java编程语言和SQL Server 2005数据库技术来构建一个实用的图书管理解决方案。这个系统旨在帮助图书馆管理员高效地...

    基于SQL server 和JAVA的图书借阅系统.zip

    该系统的核心在于SQL Server数据库的高效存储和查询能力,以及Java语言的稳定性和跨平台特性,使得系统能够满足大规模数据处理和多用户并发访问的需求。 一、SQL Server数据库 SQL Server是微软公司开发的一款关系...

    Bank_JAVA.rar_bank_java_java sql server_银行 java_银行数据库

    综上所述,"Bank_JAVA.rar"项目涵盖了从数据库设计、Java编程到多线程、安全等多个方面的知识点,是一个典型的Java与SQL Server结合的银行系统实现。通过学习这个项目,开发者可以深入理解如何构建类似的金融应用。

Global site tag (gtag.js) - Google Analytics