如果可以那么你可以在插入数据的时候获取序列里的值,这样数据就不会重复了。
其次,可以创建一个公共方法,进行数据的插入 *** 作,并且方法类型声明为 static synchronized
类型,这样基本上就不会出现数据重复的现象了
最后,要看你是怎么获得待插入源数据了,这个获得数据源的方法也做成static synchronized的公
共方法。
方法加同步锁,保证在同一个时间内只有一个人可以使用可以解决,具体可以参照http://www.blogjava.net/tscfengkui/archive/2010/11/10/337709.html?opt=admin 这个例子以mysql为数据库写的一个粗陋的demo,你参考一下,希望不会因为代码过多被百度吞了——
import java.sql.Connectionimport java.sql.DriverManager
import java.sql.PreparedStatement
import java.sql.ResultSet
import java.sql.SQLException
import java.util.ArrayList
import java.util.List
public class Test {
public static void main(String[] args) {
allotThread()
}
/**
* 将100条数据分成10份并启动10个线程分别 *** 作
*/
public static void allotThread() {
List<String[]>datas = buildDatas()
for (int i=0i<100i+=10) {
List<String[]>tenDatas = datas.subList(i, i + 10)
insertData(tenDatas)
}
}
/**
* 创建100条模拟数据
* @return
*/
public static List<String[]>buildDatas() {
List<String[]>datas = new ArrayList<String[]>()
for (int i=0i<100i++) {
String[] data = {"id " + i, "name " + i}
datas.add(data)
}
return datas
}
/**
* 启动线程进行数据插入 *** 作
* @param tenDatas
*/
public static void insertData(final List<String[]>tenDatas) {
new Thread(new Runnable() {
public void run() {
String sql = "insert into testtable (id, name) values (?, ?)"
Connection conn = null
PreparedStatement pstmt = null
try {
conn = getConnection()
conn.setAutoCommit(false)
pstmt = getPstmt(conn, sql)
for (String[] data : tenDatas) {
pstmt.setString(1, data[0])
pstmt.setString(2, data[1])
pstmt.addBatch()
}
pstmt.executeBatch()
conn.commit()
conn.setAutoCommit(true)
} catch (SQLException e) {
e.printStackTrace()
rollback(conn)
} catch (ClassNotFoundException e) {
e.printStackTrace()
} finally {
close(pstmt)
close(conn)
}
}
}).start()
}
public static Connection getConnection() throws SQLException, ClassNotFoundException {
Class.forName("com.mysql.jdbc.Driver")
String dbUrl = "jdbc:mysql://localhost/test?useUnicode=true&characterEncoding=UTF-8"
Connection conn = DriverManager.getConnection(dbUrl, "root", "tooeasy")
return conn
}
public static PreparedStatement getPstmt(Connection conn, String sql) throws SQLException, ClassNotFoundException {
PreparedStatement pstmt = conn.prepareStatement(sql)
return pstmt
}
public static void rollback(Connection conn) {
try {
if (null != conn) {
conn.rollback()
}
} catch (SQLException e) {
e.printStackTrace()
}
}
public static void close(Connection conn) {
try {
if (null != conn) {
conn.close()
}
} catch (SQLException e) {
e.printStackTrace()
}
}
public static void close(PreparedStatement pstmt) {
try {
if (null != pstmt) {
pstmt.close()
}
} catch (SQLException e) {
e.printStackTrace()
}
}
public static void close(ResultSet rs) {
try {
if (null != rs) {
rs.close()
}
} catch (SQLException e) {
e.printStackTrace()
}
}
}
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)