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

相关推荐

    java源码包---java 源码 大量 实例

     Java访问权限控制,为Java操作文件、写入文件分配合适的权限,定义写到文件的信息、定义文件,输出到c:/hello.txt、写信息到文件、关闭输出流。 Java绘制图片火焰效果 1个目标文件 摘要:Java源码,图形操作,火焰...

    JAVA上百实例源码以及开源项目

     Java访问权限控制,为Java操作文件、写入文件分配合适的权限,定义写到文件的信息、定义文件,输出到c:/hello.txt、写信息到文件、关闭输出流。 Java绘制图片火焰效果 1个目标文件 摘要:Java源码,图形操作,火焰...

    java源码包4

     Java访问权限控制,为Java操作文件、写入文件分配合适的权限,定义写到文件的信息、定义文件,输出到c:/hello.txt、写信息到文件、关闭输出流。 Java绘制图片火焰效果 1个目标文件 摘要:Java源码,图形操作,火焰...

    java源码包3

     Java访问权限控制,为Java操作文件、写入文件分配合适的权限,定义写到文件的信息、定义文件,输出到c:/hello.txt、写信息到文件、关闭输出流。 Java绘制图片火焰效果 1个目标文件 摘要:Java源码,图形操作,火焰...

    JAVA上百实例源码以及开源项目源代码

     Java访问权限控制,为Java操作文件、写入文件分配合适的权限,定义写到文件的信息、定义文件,输出到c:/hello.txt、写信息到文件、关闭输出流。 Java绘制图片火焰效果 1个目标文件 摘要:Java源码,图形操作,火焰...

    java源码包2

     Java访问权限控制,为Java操作文件、写入文件分配合适的权限,定义写到文件的信息、定义文件,输出到c:/hello.txt、写信息到文件、关闭输出流。 Java绘制图片火焰效果 1个目标文件 摘要:Java源码,图形操作,火焰...

    成百上千个Java 源码DEMO 4(1-4是独立压缩包)

    Java访问权限控制源代码 1个目标文件 摘要:Java源码,文件操作,权限控制 Java访问权限控制,为Java操作文件、写入文件分配合适的权限,定义写到文件的信息、定义文件,输出到c:/hello.txt、写信息到文件、关闭输出流...

    JAVA_API1.6文档(中文)

    java.sql 提供使用 JavaTM 编程语言访问并处理存储在数据源(通常是一个关系数据库)中的数据的 API。 java.text 提供以与自然语言无关的方式来处理文本、日期、数字和消息的类和接口。 java.text.spi java.text ...

    成百上千个Java 源码DEMO 3(1-4是独立压缩包)

    Java访问权限控制源代码 1个目标文件 摘要:Java源码,文件操作,权限控制 Java访问权限控制,为Java操作文件、写入文件分配合适的权限,定义写到文件的信息、定义文件,输出到c:/hello.txt、写信息到文件、关闭输出流...

    Java 1.6 API 中文 New

    java.sql 提供使用 JavaTM 编程语言访问并处理存储在数据源(通常是一个关系数据库)中的数据的 API。 java.text 提供以与自然语言无关的方式来处理文本、日期、数字和消息的类和接口。 java.text.spi java.text ...

    JavaAPI1.6中文chm文档 part1

    java.sql 提供使用 JavaTM 编程语言访问并处理存储在数据源(通常是一个关系数据库)中的数据的 API。 java.text 提供以与自然语言无关的方式来处理文本、日期、数字和消息的类和接口。 java.text.spi java.text ...

    java jdk-api-1.6 中文 chmd

    java.sql 提供使用 JavaTM 编程语言访问并处理存储在数据源(通常是一个关系数据库)中的数据的 API。 java.text 提供以与自然语言无关的方式来处理文本、日期、数字和消息的类和接口。 java.text.spi java.text ...

    JavaAPI中文chm文档 part2

    java.sql 提供使用 JavaTM 编程语言访问并处理存储在数据源(通常是一个关系数据库)中的数据的 API。 java.text 提供以与自然语言无关的方式来处理文本、日期、数字和消息的类和接口。 java.text.spi java.text ...

    java面试题,180多页,绝对良心制作,欢迎点评,涵盖各种知识点,排版优美,阅读舒心

    【多线程】简述synchronized 和java.util.concurrent.locks.Lock的异同? 90 【线程】ThreadLocal的作用 90 【Spring】什么是IOC和DI?DI是如何实现的 91 【Spring】spring中的IOC(控制反转)的原理 92 【Spring】...

    [Java参考文档]

    java.sql 提供使用 JavaTM 编程语言访问并处理存储在数据源(通常是一个关系数据库)中的数据的 API。 java.text 提供以与自然语言无关的方式来处理文本、日期、数字和消息的类和接口。 java.text.spi java.text ...

    [Java参考文档].JDK_API 1.6

    java.sql 提供使用 JavaTM 编程语言访问并处理存储在数据源(通常是一个关系数据库)中的数据的 API。 java.text 提供以与自然语言无关的方式来处理文本、日期、数字和消息的类和接口。 java.text.spi java.text ...

Global site tag (gtag.js) - Google Analytics