2012-04-23 32 views
6

Tôi có một tập tin văn bản ~ 6GB mà tôi cần phải phân tích cú pháp và sau đó vẫn tồn tại. Bằng cách 'phân tích cú pháp' tôi đang đọc một dòng từ tệp (thường là 2000 ký tự), tạo đối tượng Ô tô từ dòng và sau đó tôi vẫn giữ nguyên nó.vấn đề hiệu suất ngủ đông, tồn tại từng cái một hoặc khối lượng?

Tôi đang sử dụng mẫu người tiêu dùng của nhà sản xuất để phân tích và kiên trì và tự hỏi liệu nó có tạo ra bất kỳ sự khác biệt nào không (vì lý do hiệu suất) để duy trì một đối tượng tại một thời điểm hoặc 1000 (hoặc bất kỳ số tiền nào khác) trong một cam kết?

Hiện tại, tôi mất> 2 giờ để duy trì mọi thứ (3 triệu dòng) và có vẻ quá nhiều thời gian cho tôi (hoặc tôi có thể sai).

Hiện nay tôi đang làm điều này:

public void persistCar(Car car) throws Exception 
{ 
    try 
    { 
     carDAO.beginTransaction(); //get hibernate session... 

     //do all save here. 

     carDAO.commitTransaction(); // commit the session 

    }catch(Exception e) 
    { 
     carDAO.rollback(); 
     e.printStackTrace(); 
    } 
    finally 
    { 
     carDAO.close(); 
    } 
} 

Trước khi tôi thực hiện bất kỳ thay đổi thiết kế tôi đã tự hỏi nếu có một lý do tại sao thiết kế này là tốt hơn (hoặc không) và nếu như vậy, những gì nên được những chiếc xe. kích thước()? Ngoài ra, mở/đóng phiên có đắt không?

public void persistCars(List<Car> cars) throws Exception 
{ 
    try 
    { 
     carDAO.beginTransaction(); //get hibernate session... 
     for (Car car : cars)  
     //do all save here. 

     carDAO.commitTransaction(); // commit the session 

    }catch(Exception e) 
    { 
     carDAO.rollback(); 
     e.printStackTrace(); 
    } 
    finally 
    { 
     carDAO.close(); 
    } 
} 

Trả lời

5

Theo truyền thống, hibernate không hoạt động tốt với chèn hàng loạt. Có một số cách để tối ưu hóa nó ở một mức độ nào đó.

Hãy ví dụ này từ API Docs,

Session session = sessionFactory.openSession(); 
Transaction tx = session.beginTransaction(); 

for (int i=0; i<100000; i++) { 
    Customer customer = new Customer(.....); 
    session.save(customer); 
    if (i % 20 == 0) { //20, same as the JDBC batch size 
     //flush a batch of inserts and release memory: 
     session.flush(); 
     session.clear(); 
    } 
} 

tx.commit(); 
session.close(); 

Trong ví dụ trên phiên nếu đỏ mặt sau khi chèn 20 mục mà sẽ làm cho hoạt động ít nhanh hơn.

Ở đây, interesting article thảo luận về cùng một nội dung.

Chúng tôi đã triển khai thành công cách thay thế hàng loạt chèn bằng cách sử dụng các thủ tục được lưu trữ. Trong trường hợp này, bạn sẽ chuyển các tham số cho SP là "|" tách danh sách, và sẽ viết các tập lệnh chèn bên trong SP. Ở đây mã có thể trông hơi phức tạp nhưng rất hiệu quả.

+0

Tôi sẽ thử mã này để có hiệu suất và quay lại câu trả lời này. Cảm ơn! – adhg

+0

phân luồng tốt hơn! – adhg

Các vấn đề liên quan