【问题标题】:i have 25 million record in my database and i want to retrieve it using java我的数据库中有 2500 万条记录,我想使用 java 检索它
【发布时间】:2015-01-19 10:20:08
【问题描述】:

我的数据库中有 2500 万条记录,我想使用 java 检索它。我的连接在 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”和“kk”是可怕的名字。我可以说它们是计数器,因为您正在递增它们,但是它们的名称并不能帮助读者(我自己或您自己)看到正在计数的内容。抱歉,这不是你问的,但你可能仍然需要听到它。 ;-)
  • 使用更智能的 SQL 语句更新值可能会起作用。您不需要全部选择下摆。只需UPDATE .. WHERE...,如果您需要更多内容,您可以使用JOIN。一条一条地更新 25M 条记录是错误的。
  • 为什么会终止?它不应该在没有错误的情况下终止,并且您无法在不知道错误是什么的情况下解决此问题。
  • @PeterLawrey java.sql.SQLException:侦听器拒绝连接并出现以下错误:ORA-12519,TNS:找不到合适的服务处理程序客户端使用的连接描述符是:localhost:1521:xe这就是我得到的
  • 为什么不为此使用数据库存储过程并通过将参数作为参数传递给数据库过程来从 Java 调用过程?

标签: java


【解决方案1】:

我认为当前的问题是您在这部分代码中疯狂地泄漏连接:

        ...
        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 数据库服务器就会拒绝为您提供更多连接。


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

【讨论】:

  • 我尝试了很多东西,但它是唯一有效的东西,所以我使用了这种方法。我知道我应该关闭连接,但你可以在代码中看到我已经评论过它,因为每当我这样做时,它只会给我大约 200 条记录。我也是一个java人所以我面临这个问题请任何了解sql、psql或java的人帮助我提前谢谢你
  • “我尝试了很多东西......” - 说真的,这是错误的编程方式。你需要做的是回到你开始的地方,并正确地调试你的代码。如果它不起作用,那么你需要找出原因它不起作用,而不是随意尝试其他东西,希望它们会更好。
  • 您无需成为 SQL 专家也能在这里工作。问题出在您正在进行的 JDBC 调用中。您需要阅读有关 JDBC 的优秀教程,特别注意应该如何管理连接。
【解决方案2】:

我认为超时有问题,所以像这样增加超时

con.setNetworkTimeout(null, 100000);

【讨论】:

  • 线程“main”中的异常 java.lang.AbstractMethodError: oracle.jdbc.driver.T4CConnection.setNetworkTimeout(Ljava/util/concurrent/Executor;I)V at spliting.SpaceSpliting.addingValues(SpaceSpliting. java:42) at spliting.SpaceSpliting.main(SpaceSpliting.java:138) 这是我设置时间时得到的结果
【解决方案3】:

也许问题是你释放了用于读取所有者表的变量con

    public void addingValues()
    {
        try
        {
            Connection con=getConnection();
            Statement st=con.createStatement();
            ResultSet rs=st.executeQuery("select * from owner");
            while(rs.next())
            {

                [...]

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

通过为con 分配一个新值,原来的Connection 对象是孤立的。如果不再引用原始 Connection 对象,它很可能会被垃圾收集器丢弃,并因此关闭正在运行的请求。

【讨论】:

    【解决方案4】:

    我遇到了类似的问题,将自动提交标志设置为 false 并手动提交事务就可以了。由于记录数为 2500 万,因此您还应该采取更大的批次。

    如果您尝试了其他答案中给出的解决方案,但错误仍未解决,那么您可能想试试这个:

    JAVA: sqlite throws exception after writing a few records?

    【讨论】:

      猜你喜欢
      • 2011-11-29
      • 1970-01-01
      • 2022-11-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-02-11
      相关资源
      最近更新 更多