分享一個最近在做項目時遇到的問題
也不是什么大問題,但是需要細心來解決,因為以后可能還會遇到所以寫一篇博客來記錄。
源錯誤代碼如下
`import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.SQLException;
public class TestJava{
private static Connection conn;
private static PreparedStatement pst;
public static void main(String[] args) {
try {
//反射獲得驅動
Class.forName(“oracle.jdbc.driver.OracleDriver”);
//連接服務器
conn = DriverManager.getConnection(“jdbc:oracle:thin:@localhost:1521:XE”, “hongli”, “hongli”);
//sql命令
String sql = “insert into t_detail_31(aaa_login_name,login_ip,nas_ip,time_duration) values (?,?,?,?)”;//填入數據
for(int i=0;i<10000;i++){
//預編譯
pst = conn.prepareStatement(sql);
pst.setString(1, "hongli");
pst.setString(2, "232,23.234");
pst.setString(3, "sf.s3.43");
pst.setInt(4, i);
pst.executeUpdate();
}
} catch (ClassNotFoundException e) {
System.out.println("驅動文件未找到");
e.printStackTrace();
} catch (SQLException e) {
System.out.println("sql連接異常");
e.printStackTrace();
}finally{
try {
if(pst!=null) pst.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}`
然后就發生了錯誤,經過一番檢查發現異常出現在第301個數據。前三百個數據都能插入,但是第301個數據的時候就會報錯,這是為什么呢?是因為在java代碼中,執行statement的時候,實際上是在在數據庫中打開了一個cursor(游標-游標是系統為用戶開設的一個數據緩沖區,存放SQL語句的執行結果)。如果你的Statement是在一個循環里面的話,就會非常容易出現這個問題。因為游標一直在不停的打開,而且沒有關閉。
目前想到的解決方案有兩個:
1、在for循環以前創建一個statement,但有一個問題,萬一下次數據沒有完全覆蓋了本次數據,那么就會造成數據的混亂,so不建議。
2、每次for循環開始創建一個statement,每次for循環結束時,關閉。
於是代碼就變成了如下:import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.SQLException;
public class TestJava{
private static Connection conn;
private static PreparedStatement pst;
public static void main(String[] args) {
try {
//反射獲得驅動
Class.forName("oracle.jdbc.driver.OracleDriver");
//連接服務器
conn = DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:XE", "hongli", "hongli");
//sql命令
String sql = "insert into t_detail_31(aaa_login_name,login_ip,nas_ip,time_duration) values (?,?,?,?)";
//填入數據
for(int i=0;i<10000;i++){
//預編譯
pst = conn.prepareStatement(sql);
pst.setString(1, "hongli");
pst.setString(2, "232,23.234");
pst.setString(3, "sf.s3.43");
pst.setInt(4, i);
pst.executeUpdate();
try {
if(pst!=null) pst.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
} catch (ClassNotFoundException e) {
System.out.println("驅動文件未找到");
e.printStackTrace();
} catch (SQLException e) {
System.out.println("sql連接異常");
e.printStackTrace();
}
}
}