Сократите время при загрузке данных из файла в MySQL, используя Hibernate - PullRequest
0 голосов
/ 24 июня 2019

У меня есть CSV-файл, который содержит около 1 миллиона записей.каждая строка, представляющая объект студента.

В слое обслуживания я читаю файл csv и изменяю его на сущность, как показано ниже:

 File file = new File("test.csv");
    try
    {
        String csvFile = "test.csv";
        BufferedReader br = null;
        String line = "";
        String cvsSplitBy = ",";
        try
        {
            br = new BufferedReader(new FileReader(csvFile));
            while ((line = br.readLine()) != null)
            {
                // use comma as separator
                String[] student = line.split(cvsSplitBy);
                System.out
                    .println("Country [code= " + student[0] + " , name=" + student[1] + "]");
                StudentTable st = new StudentTable();
                st.setEmplyoee(student[0]);
                st.setName(student[1]);
                springbootDao.saveStudent(st);
            }
        }
        catch (FileNotFoundException e)
        {
            e.printStackTrace();
        }
        catch (IOException e)
        {
            e.printStackTrace();
        }
        finally
        {
            if (br != null)
            {
                try
                {
                    br.close();
                }
                catch (IOException e)
                {
                    e.printStackTrace();
                }
            }
        }
    }
    catch (Exception e)
    {
        e.printStackTrace();
    }

для слоя дао

void saveStudent(StudentTable st)
    {
        getSession();
        session.save(st);
        session.beginTransaction().commit();
    }


private Session getSession()
    {
        if (session == null)
        {
            session = entity.unwrap(SessionFactory.class).openSession();
        }
        return session;
    }

Когда я пытаюсь сохранить его, он экономит 1 миллион раз, скажем, сохранить для каждой строки, которая должна соответствовать логике.

Очевидно, что это не очень хороший способ.Могу ли я в любом случае оптимизировать его, используя несколько потоков, чтобы повысить скорость, поскольку очевидно, что отдельный поток займет больше времени, или любой метод в спящем режиме, который я могу использовать для сброса данных для повышения скорости?

больше обновлений:

Я изменил его на

while ((line = br.readLine()) != null)
{
// use comma as separator
String[] student = line.split(cvsSplitBy); //java.lang.OutOfMemoryError: Java heap space
StudentTable st = new StudentTable();
st.setEmplyoee(student[0]);
st.setName(student[1]);
stList.add(st);
}
springbootDao.saveStudent(stList);

Теперь я столкнулся с ошибкой памяти

1 Ответ

0 голосов
/ 24 июня 2019

сделал это следующим образом:

уровень обслуживания:

String csvFile = "test.csv";
    BufferedReader br = null;
    String line = "";
    String cvsSplitBy = ",";
    try
    {
        List<StudentTable> stList = new ArrayList<StudentTable>();
        br = new BufferedReader(new FileReader(csvFile));
        StudentTable st = new StudentTable();
        while ((line = br.readLine()) != null)
        {
            // use comma as separator
            String[] student = line.split(cvsSplitBy);
            st.setEmplyoee(student[0]);
            st.setName(student[1]);
            stList.add(st);
        }
        springbootDao.saveStudent(stList);
    }
    catch (FileNotFoundException e)
    {
        e.printStackTrace();
    }
    catch (IOException e)
    {
        e.printStackTrace();
    }
    finally
    {
        if (br != null)
        {
            try
            {
                br.close();
            }
            catch (IOException e)
            {
                e.printStackTrace();
            }
        }
    }
dao layer:




// System.out.println("dao layer" + st);
    getSession();
    Transaction tx = session.beginTransaction();
    session.doWork(new Work()
    {
        @Override
        public void execute(Connection conn)
            throws SQLException
        {
            PreparedStatement pstmt = null;
            try
            {
                String sqlInsert = "insert into student (name,emplyoee) values (?,?) ";
                pstmt = conn.prepareStatement(sqlInsert);
                int i = 0;
                for (StudentTable name : st)
                {
                    pstmt.setString(1, name.getName());
                    pstmt.setString(2, name.getEmplyoee());
                    pstmt.addBatch();
                    // 20 : JDBC batch size
                    if (i % 200000 == 0)
                    {
                        System.out.println(name.getEmplyoee() + "-------------------");
                        pstmt.executeBatch();
                    }
                    i++;
                }
                pstmt.executeBatch();
            }
            finally
            {
                pstmt.close();
            }
        }
    });
    tx.commit();
    session.close();
    // session.save(st);
    // session.beginTransaction().commit();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...