分享一个最近在做项目时遇到的问题
也不是什么大问题,但是需要细心来解决,因为以后可能还会遇到所以写一篇博客来记录。
源错误代码如下
`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();
}
}
}