今天在寫一個電信寬帶運營支撐系統時,報了一個遊標不足的錯誤,一臉蒙,代碼是這樣:
public void saveToDB(Collection<BIDR> arg0) throws Exception {
Connection conn = ConnectionFaction.getConnection();
//conn.setAutoCommit(false);
//int num=0;
for(BIDR b:arg0) {
//num++;
int i = new Date(b.getLogin_date().getTime()).getDate();
System.out.println(i);
String sql="insert into t_detail_"+i+" values(?,?,?,?,?,?)";
PreparedStatement prs = conn.prepareStatement(sql);
prs.setString(1, b.getAAA_login_name());
prs.setString(2, b.getLogin_ip());
prs.setTimestamp(3, b.getLogin_date());
prs.setTimestamp(4, b.getLogout_date());
prs.setString(5, b.getNAS_ip());
prs.setInt(6, b.getTime_deration());
prs.execute();
}
//conn.commit();
}
很簡單的使用jdbc向數據庫中插入數據的語句,爲什麼會報遊標不足的錯誤呢?
想了好久,發現以前寫preparedStatement時都是在循環外建的對象,這次是在for循環內,因爲特殊需要,那麼可能是preparedStatement對象沒有關閉導致的嗎?
於是在每次執行玩sql語句後,都關閉以下preparedStatement。
public void saveToDB(Collection<BIDR> arg0) throws Exception {
Connection conn = ConnectionFaction.getConnection();
//conn.setAutoCommit(false);
//int num=0;
for(BIDR b:arg0) {
//num++;
int i = new Date(b.getLogin_date().getTime()).getDate();
System.out.println(i);
String sql="insert into t_detail_"+i+" values(?,?,?,?,?,?)";
PreparedStatement prs = conn.prepareStatement(sql);
prs.setString(1, b.getAAA_login_name());
prs.setString(2, b.getLogin_ip());
prs.setTimestamp(3, b.getLogin_date());
prs.setTimestamp(4, b.getLogout_date());
prs.setString(5, b.getNAS_ip());
prs.setInt(6, b.getTime_deration());
prs.execute();
prs.close();
}
插入成功!
記錄一下~~~~