各位技术大牛,请教java多线程问题

由于项目需要,需要从oracle中dept将表记录迁移到dept2中,dept和dept2表结构一样。
设想:

查询:
Statementstmt=conn.createStatement(
ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY);

ResultSetrs=stmt.executeQuery("select*fromdept");

通过rs.last();得到记录的总个数,然后通过这个总个数,多线程实现迁移所有的记录。

插入:
PreparedStatementpstmt=null;
Stringpsql="insertintodept2values(?,?,?)";
pstmt=conn.prepareStatement(psql);

其中的index为rs结果集的索引值,当index=1,表示rs.next()的第一个值
rs.absolute(index);
pstmt.setInt(1,rs.getInt(1));
pstmt.setString(2,rs.getString(2));
pstmt.setString(3,rs.getString(3));

pstmt.addBatch();

本人对多线程不是很了解,多次尝试,没能实现多线程迁移数据,希望有高手指点。谢谢!

publicclassConcurrentTestPreparedStmt

{

publicstaticinttotalRowNum;

publicstaticintindex=1;

publicstaticbooleanisFinish;

publicstaticvoidmain(String[]args)throwsException

{

Class.forName("oracle.jdbc.driver.OracleDriver");

Stringurl="jdbc:oracle:thin:@192.168.5.201:1521:orcl";

Stringuser="scott";

Stringpassword="tiger";

Stringsql="select*fromdept";

Connectionconn=DriverManager.getConnection(url,user,password);

/**

*读取

*/

Statementstmt=conn.createStatement(

ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY);

ResultSetrs=stmt.executeQuery(sql);

/**

*写入

*使用批处理

*/

PreparedStatementpstmt=null;

Stringpsql="insertintotestpstmtvalues(?,?,?)";

pstmt=conn.prepareStatement(psql);

//rs.next只要为true,说明表中记录数

rs.last();

totalRowNum=rs.getRow();

inti=0;

//问题所在,当i<2时,表示两个线程,执行时,往目的表中插入了同样一行记录。

while(i<1&&!isFinish)

{

TaskThreadt=newConcurrentTestPreparedStmt().newTaskThread(

pstmt,rs);

newThread(t).start();

i++;

}

//如果没完成,则主线程等待

while(!isFinish)

{

Thread.sleep(500);

}

pstmt.executeBatch();

conn.commit();

System.out.println("SUCCESS");

}

publicsynchronizedintincrementIndex()

{

returnindex++;

}

publicsynchronizedintgetExecuteNum()

{

returnindex;

}

/**

*并发迁移类

*@authorttan

*/

classTaskThreadimplementsRunnable

{

PreparedStatementpstmt=null;

ResultSetrs=null;

publicTaskThread(PreparedStatementpstmt,ResultSetrs)

{

this.rs=rs;

this.pstmt=pstmt;

}

@Override

publicvoidrun()

{

intindex=incrementIndex();

//指定到具体的行数

try

{

while(index<=totalRowNum)

{

System.out.println("index="+index);

rs.absolute(index);

pstmt.setInt(1,rs.getInt(1));

pstmt.setString(2,rs.getString(2));

pstmt.setString(3,rs.getString(3));

pstmt.addBatch();

index=incrementIndex();

}

if(getExecuteNum()>totalRowNum)

{

isFinish=true;

return;

}

}

catch(SQLExceptione)

{

e.printStackTrace();

}

}

}

}

java企业级通用权限安全框架源码获取【下载地址】