Pertanyaannya agak teoritis, berapa biaya pembuatan konteks JAXB, marshaller dan unmarshaller?
Saya telah menemukan bahwa kode saya bisa mendapatkan keuntungan dari menjaga konteks JAXB yang sama dan mungkin marshaller yang sama untuk semua operasi marshaling daripada membuat konteks dan marshaller pada setiap marshaling.
Jadi berapa biaya untuk membuat konteks JAXB dan marshaller / unmarshaller? Bolehkah membuat konteks + marshaller untuk setiap operasi marshaling atau lebih baik menghindarinya?
sumber
Idealnya, Anda harus memiliki
JAXBContext
instance tunggal dan lokal dariMarshaller
danUnmarshaller
.JAXBContext
Instance aman untuk thread sementaraMarshaller
danUnmarshaller
instance tidak aman untuk thread dan tidak boleh dibagikan di seluruh thread.sumber
Sayangnya hal ini tidak dijelaskan secara spesifik di javadoc. Apa yang dapat saya katakan adalah bahwa Spring menggunakan JAXBContext global, dibagi di antara utas, sedangkan itu menciptakan marshaller baru untuk setiap operasi marshalling, dengan komentar javadoc dalam kode yang mengatakan bahwa marshaller JAXB belum tentu aman untuk thread.
Hal yang sama dikatakan di halaman ini: https://javaee.github.io/jaxb-v2/doc/user-guide/ch03.html#other-miscellaneous-topics-performance-and-thread-safety .
Saya akan menebak bahwa membuat JAXBContext adalah operasi yang mahal, karena melibatkan pemindaian kelas dan paket untuk penjelasan. Tapi mengukurnya adalah cara terbaik untuk mengetahuinya.
sumber
JAXB 2.2 ( JSR-222 ) mengatakan ini, di bagian "4.2 JAXBContext":
Sayangnya, spesifikasi tersebut tidak membuat klaim apa pun terkait keamanan ulir
Unmarshaller
danMarshaller
. Jadi yang terbaik adalah menganggap mereka tidak benar.sumber
Saya memecahkan masalah ini menggunakan:
sumber
Bahkan lebih baik!! Berdasarkan solusi yang baik dari posting di atas, buat konteks hanya sekali dalam konstruktor, dan simpan sebagai ganti kelas.
Ganti baris:
dengan yang ini:
Dan konstruktor utama dengan yang ini:
jadi di getMarshaller / getUnmarshaller Anda dapat menghapus baris ini:
Peningkatan ini membuat, dalam kasus saya, waktu pemrosesan turun dari 60 ~ 70ms menjadi hanya 5 ~ 10ms
sumber
Saya biasanya memecahkan masalah seperti ini dengan
ThreadLocal
pola kelas. Mengingat fakta bahwa Anda memerlukan marshaller yang berbeda untuk setiap Kelas, Anda dapat menggabungkannya dengansingleton
pola -map.Untuk menghemat waktu kerja 15 menit. Di sini mengikuti implementasi saya tentang Pabrik thread-safe untuk Jaxb Marshallers dan Unmarshallers.
Ini memungkinkan Anda untuk mengakses instance sebagai berikut ...
Dan kode yang Anda perlukan adalah kelas Jaxb kecil yang terlihat seperti berikut:
sumber