我的数据库中有2500万条记录,我想使用java.my检索它。我的连接在5000条记录后终止。我应该怎么做才能保持连接的活力

package spliting;
import java.sql.*;
import java.util.ArrayList;


public class SpaceSpliting {

    public Connection getConnection()
    {
        Connection con=null;
        try
        {
            Class.forName("oracle.jdbc.driver.OracleDriver");
            con=DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:xe","abc","abc");
        }
        catch(Exception e)
        {
           System.out.println(e);
        }
        return con;
    }
    public void addingValues()
    {
        int m=0,kk=0;
        try
        {
            Connection con=getConnection();
            Statement st=con.createStatement();
            ResultSet rs=st.executeQuery("select * from owner");
            while(rs.next())
            {

                String model=rs.getString(2);
                System.out.println(model);
                if(model==null)
                {
                    kk++;
                    System.out.println(0+" "+kk);
                    m++;

                }
                else
                {

                String[] amodel=model.split(" ");
                System.out.println(amodel.length);
                if(amodel.length==1)
                {
                    System.out.println("1");


                    Statement st1=con.createStatement();
                    st1.executeUpdate("update owner set maker='"+amodel[0]+"'where model_desc='"+model+"'");



                kk++;
                System.out.println("records updated"+" "+kk);
                }
                if(amodel.length==2)
                {
                    System.out.println("2");


                    Statement st1=con.createStatement();
                    st1.executeUpdate("update owner set maker='"+amodel[0]+"',model1='"+amodel[1]+"' where model_desc='"+model+"'");



                kk++;
                System.out.println("records updated"+" "+kk);
                }
                if(amodel.length==3)
                {
                    System.out.println("3");


                    Statement st1=con.createStatement();
                    st1.executeUpdate("update owner set maker='"+amodel[0]+"',model1='"+amodel[1]+"',model2='"+amodel[2]+"' where model_desc='"+model+"'");


                kk++;
                System.out.println("records updated"+" "+kk);
                }
                if(amodel.length>=4)
                {
                    System.out.println("4");

                    Statement st1=con.createStatement();
                    st1.executeUpdate("update owner set maker='"+amodel[0]+"',model1='"+amodel[1]+"',model2='"+amodel[2]+"',model3='"+amodel[3]+"' where model_desc='"+model+"'");


                kk++;
                System.out.println("records updated"+" "+kk);
                }
                m++;
                //con=getConnection();
                }
                if(m==50)
                {
                    ArrayList al=new ArrayList();
                    al.add(rs);
                    //con.close();
                    con=getConnection();
                    rs=(ResultSet)al.get(0);
                    m=0;
                }
            }

            //System.out.println("COLUMN ADDED");
        }
        catch(Exception e)
        {
            System.out.println(e);
        }
    }

    public static void main(String[] args) {
        SpaceSpliting ss=new SpaceSpliting();
        //ss.addingColumn();
        ss.addingValues();
        // TODO Auto-generated method stub

    }

}

最佳答案

我认为最直接的问题是您在代码的这一部分泄漏了疯狂的连接:

        ...
        m++;
        //con=getConnection();
    }
    if(m==50)
    {
        ArrayList al=new ArrayList();
        al.add(rs);
        //con.close();
        con=getConnection();
        rs=(ResultSet)al.get(0);
        m=0;
    }


似乎从主ResultSet中读取的每50个结果中都会创建一个新的数据库连接。我看不到您要关闭它们的位置。不久之后,Oracle DB服务器将拒绝为您提供更多连接。



但是,要检索2500万个结果并执行2500万个单独更新的很大一部分,将花费很长时间。我认为您应该尝试使用更聪明的SQL ...或在PLSQL中执行此操作。 (咨询数据库专家。我只是一个Java专家:-))

10-06 03:56