java 并发插入数据到oracle
各位技术大牛,请教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企业级通用权限安全框架源码获取【下载地址】
声明:本站所有文章资源内容,如无特殊说明或标注,均为采集网络资源。如若本站内容侵犯了原著者的合法权益,可联系本站删除。